Node.jsで基になる接続を開いたままにする(キープアライブ)ようにHTTPクライアントをセットアップしようとしていますが、動作がドキュメント( http://nodejs.org /api/http.html#http_class_http_agent )。
新しいHTTPエージェントを作成して、maxSocketsプロパティを1に設定し、URLを要求しています(たとえば、http://www.twilio.com/
) 毎秒。
リクエストごとにソケットが閉じられ、新しいソケットが作成されるようです。 Ubuntu 14.04でnode.js 0.10.25および0.10.36を使用してこれをテストしました。
誰かが仕事を続けることができましたか?
これがコードです:
var http = require("http");
var agent = new http.Agent();
agent.maxSockets = 1;
var sockets = [];
function request(hostname, path, callback) {
var options = {
hostname: hostname,
path: path,
agent: agent,
headers: {"Connection": "keep-alive"}
};
var req = http.get(options, function(res) {
res.setEncoding('utf8');
var body = "";
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
callback(null, res, body);
});
});
req.on('error', function(e) {
return callback(error);
});
req.on("socket", function (socket) {
if (sockets.indexOf(socket) === -1) {
console.log("new socket created");
sockets.Push(socket);
socket.on("close", function() {
console.log("socket has been closed");
});
}
});
}
function run() {
request('www.twilio.com', '/', function (error, res, body) {
setTimeout(run, 1000);
});
}
run();
間違えなければ、接続プールは0.12で実装されました。
したがって、0.12より前の接続プールが必要な場合は、単純に request モジュールを使用できます。
var request = require('request')
request.get('www.twilio.com', {forever: true}, function (err, res, body) {});
ノード0.12+を使用していて、HTTPコアモジュールを直接使用する場合は、これを使用してエージェントを初期化できます。
var agent = new http.Agent({
keepAlive: true,
maxSockets: 1,
keepAliveMsecs: 3000
})
keepAlive: true
プロパティ、つまり、ソケットを開いたままにするためにrequiredです。
エージェントを request モジュールに渡すこともできます。これも0.12+でのみ機能し、それ以外の場合はデフォルトで内部プール実装になります。
ノード0.12+で動作するはずです。この目的で別のエージェントを使用することもできます。たとえば keep-alive-agent はあなたが望むことをすることができます:
var KeepAliveAgent = require('keep-alive-agent'),
agent = new KeepAliveAgent();
以下は、keepaliveagentにnpmモジュールを使用するmeteorで私のために働きました
var agent = new KeepAliveAgent({ maxSockets: 1 });
var options = {
agent:agent,
headers: {"Connection":"Keep-Alive"}
}
try {
var client = Soap.createClient(url);
var result = client.myfirstfunction(args,options);
//process result
result = client.mysecondfunction(args,options);
}
どちらのメソッド呼び出しも、1つのソケット接続でデータを返します。各メソッド呼び出しでオプションを渡します