私は、現在の OSGi プロジェクト用にカスタムProxySelector実装を作成することを任されました。プロキシの認証を使用するには、カスタムのAuthenticatorも作成する必要がありました。
OSGi バンドルの開始時にこれらのカスタム実装を設定すると、うまく機能します。しかし、OSGi バンドルは停止/アンインストールできるため、次の質問に至ります。
実装を設定解除し、デフォルト (JVM) 実装を復元するにはどうすればよいですか?
バンドルが開始する間、デフォルトの実装を保存します。
ProxySelector defaultSelector = ProxySelector.getDefault()
ProxySelector.setDefault(new MyProxySelector());
残念ながら、Authenticator にはメソッドがありませんgetDefault()
。
バンドルが停止しているとき、次のように ProxySelector と Authenticator の設定を解除します。
ProxySelector.setDefault(defaultSelector); // see above
Authenticator.setDefault(null);
しかし、これはうまくいきません。バンドルが停止すると、接続できなくなります。
私の唯一の説明は、を設定することdefaultSelector
は参照を渡すだけだということです。ProxySelector が破棄されると、これらの参照ポイントがどこにもないため、JVM に有効な ProxySelector がなくなります。私が思いついた最善の解決策は、セレクターを複製することでした。しかし、ProxySelector にはメソッドがありませんclone()
。defaultSelector
をデフォルトの実装 ( sun.net.spi.DefaultProxySelector ) にキャストすることは、最善の解決策ではないかもしれませんが、うまくいく可能性があります。以前に設定された他のカスタム実装をオーバーライドする可能性があるため、問題になる可能性があります。
では、これに対するベストプラクティスは何ですか?