2

我有一个运行一些包的 OSGi 环境,其中一个使用服务总线 API(Azure Java SDK v 0.4.4),并且在我重新加载我的 OSGi 环境后出现了一些错误。工作流程是这样的:

  • 初始化 JVM 和 OSGi 框架
  • 捆绑包已加载并启动
  • 服务总线包使用“ServiceBusConfiguration.configureWithWrapAuthentication(v,w,x,y,z)”调用创建配置,一切运行顺利

  • 我以编程方式重新启动 OSGi 框架,然后加载并重新启动所有捆绑包

  • 服务总线包尝试使用“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时,在第一次运行之后也被检查。

所以在我看来,一定有一些东西会阻止服务的正确重新加载,但我无法弄清楚到底发生了什么。

希望你们中的任何人对此有所了解!

4

1 回答 1

3

ServiceLoader 是 JRE 类库的一部分,它不知道 OSGi 类加载。当你重新启动一个 OSGi 框架时,所有的包都会获得新的类加载器,因此从包中加载的类是不同的类对象。如果 ServiceLoader 实例在框架重新启动后仍然存在,它仍将引用原始类对象。

于 2013-10-08T19:55:00.433 回答