私はテストプログラムTを持っています:
- サーバーS
Remote
の RMI レジストリからオブジェクト Oのスタブを取得します。 - 何百もの並列スレッドで、このオブジェクトOのメソッドを呼び出します。
サーバーSに多くの「RMI TCP 接続」スレッドがあることがわかります。TにはOのスタブが 1 つしかないため、1 つしかないと予想していました。これはどのように作動しますか?
RMI には、スレッドごとのエンドポイントごとの接続が必要です。クライアント側でそれらをプールし、サーバー側でもプールが発生するため、実際にはそれほど悪くはありませんが、同時に RMI 呼び出しを実行する 1000 のスレッドがある場合、1000 の接続が確実に存在します。 . それらは多重化されていません。
RMI は、可能であればサーバー ソケットとクライアント ソケットを再利用しようとするはずです。
あなたのケースは、サーバーソケットファクトリが同等でない場合に発生します(equalsが実行されると、結果はfalseになり、接続が再度確立されます)。おそらく、スタブは hashCode と equals を実装していないため、ソケットが使用可能かどうかを知る確実な方法はありません。