我的任务是为我们当前的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 )可能不是最佳解决方案,但可以正常工作。这可能是一个问题,因为它可能会覆盖之前设置的其他自定义实现。
那么你最好的做法是什么?