2012-04-10 16 views
4

Java RMIのトピックで作業中で、クライアント側で接続プールに関する情報が必要です。文献とドキュメンテーションには、これらのトピックに対する明確な答えはありません。私は接続プーリングがRMI仕様の一部ではないことを知っています。しかし、いくつかの実装(例えばSUNの実装)ではそれが行われます。だから私の質問はこの実装を参照しています。Java RMI接続プールの詳細

RMIソケットファクトリによって作成されたソケット(java.net.Socket)がプールにキャッシュされているとします。あれは正しいですか?

これらの接続はどのように保存されますか?私は、HashMapが目的のip/portをキーとして使用し、ソケットが値として使用される点を除いては同じです。

ソケットはタイムアウトを使用して閉じられます。接続アイドル時間に関する情報はどのようにして得られましたか?おそらく、接続が最後に使用されたときに、何らかのタイムスタンプがあります。

+0

これらの質問はすべて、OpenJDKのソースを参照することで回答できます。 'sun.rmi.transport.proxy.RMIMasterSocketFactory'で始まります。 – artbristol

答えて

2

私はSunの実装について話しています念頭に置いて:

私は RMIソケットファクトリによって作成されたソケット(のjava.net.Socket)がプールにキャッシュされているものとします。あれは正しいですか?

はい、それはリモート呼び出しから解放され、もちろんリモート呼び出しは新しいソケットを作成するようにソケットファクトリに依頼する前にプール内を調べます。

これらの接続はどのように保存されますか?私は、HashMapがキーとして宛先IP /ポートと値としてソケットを使用して が使用されている点を除きたいと思います。

論理的に、ip:portからSocketへのマップが必要であるとしましょう。実装の詳細は実際には重要ではありません。

ソケットはタイムアウトを使用して閉じられます。 接続アイドル時間に関する情報はどのようにして得られましたか?

接続がプールに挿入された時刻を記録することにより、

0

Oracle/OpenJDKでは、特定のエンドポイント(特定のチャネル)への(アイドル)接続リストはList<TCPConnectiont> sun.rmi.transport.tcp.TCPChannel#freeListに保持されます。最大サイズはありません。ソケットがアイドル状態であることを15秒以上チェックするリーパースレッドがあります(-Dsun.rmi.transport.connectionTimeout=15000)。

チャンネルはWeakHashMapとしてMap<TCPEndpoint,Reference<TCPChannel>> sun.rmi.transport.tcp.TCPTransport#channelTableに格納されます。

受付側に処理スレッド(-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited)の可能な(グローバル)制限があります。