我有一个运行一些 bundle 的 OSGi 环境,其中一个使用服务总线 API(Azure Java SDK v 0.4.4),并且在重新加载 OSGi 环境后出现一些错误。工作流程是这样的:
- 初始化 JVM 和 OSGi 框架
- bundle 已加载并启动
服务总线 bundle 使用“ServiceBusConfiguration.configureWithWrapAuthentication(v,w,x,y,z)”调用创建配置,一切顺利运行
我以编程方式重新启动 OSGi 框架,然后加载所有包并再次启动
- 服务总线 bundle 尝试使用“ServiceBusConfiguration.configureWithWrapAuthentication(v,w,x,y,z)”创建配置,但这次我收到以下错误:
Exception in thread "Thread-7" java.util.ServiceConfigurationError: com.microsoft.windowsazure.services.core.Builder$Exports: Provider com.microsoft.windowsazure.services.blob.Exports not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:231)
at java.util.ServiceLoader.access$300(ServiceLoader.java:181)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:369)
at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
at com.microsoft.windowsazure.services.core.DefaultBuilder.create(DefaultBuilder.java:43)
at com.microsoft.windowsazure.services.core.Configuration.<init>(Configuration.java:52)
at com.microsoft.windowsazure.services.core.Configuration.load(Configuration.java:78)
at com.microsoft.windowsazure.services.core.Configuration.getInstance(Configuration.java:63)
at com.microsoft.windowsazure.services.serviceBus.ServiceBusConfiguration.configureWithWrapAuthentication(ServiceBusConfiguration.java:88)
经过一些调试后,我发现这可能是 ServiceLoader 的问题,更确切地说,当它检查 com.microsoft.windowsazure.services.blob.Exports
时是子类或实现 com.microsoft.windowsazure.services.core.Builder$Exports
在第一次运行期间也会对其进行检查。
所以在我看来,一定有什么东西阻止了服务的正确重新加载,但我无法弄清楚到底发生了什么。
希望大家对此有所了解!
最佳答案
ServiceLoader 是 JRE 类库的一部分,它不知道 OSGi 类加载。当您重新启动 OSGi 框架时,所有 bundle 都会获得新的类加载器,因此从 bundle 加载的类是与以前不同的类对象。如果 ServiceLoader 实例在框架重新启动后仍然存在,它仍然会引用原始类对象。
关于java - ServiceBus JAVA SDK高级重新加载错误,ServiceLoader(不是子类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249008/