4

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

那么,您对此的最佳做法是什么?

4

0 回答 0