java - OSGi/Equinox、声明式服务和延迟加载

标签 java osgi equinox lazy-loading declarative-services

我正在尝试使用声明式服务创建一个服务包,为另一个包提供功能。但是,我希望我的服务提供商包在需要时才启动。让我描述一下我的条件。

有两个包:

-com.example.serviceprovider

-com.example.serviceconsumer

Service Provider bundle 使用声明式服务提供如下服务:

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true"     immediate="true" name="samplerunnable1">
<implementation class="com.example.serviceprovider.SampleRunnable"/>
<service>
    <provide interface="java.lang.Runnable"/>
</service>

服务消费者引用提供的服务如下:

<reference name="SampleRunnable"
    interface="java.lang.Runnable"
    bind="setRunnable"
    unbind="unsetRunnable"
    cardinality="1..n"
    policy="dynamic"/>

当这两个 bundle 在启动时都处于“ACTIVE”状态时,服务消费者可以毫无问题地与服务提供者声明的服务进行通信。当我尝试让服务提供商以懒惰的方式启动时,就会出现问题。

将服务提供者设置为延迟加载后,这是我在 OSGi 控制台中得到的:

osgi> ss
  "Framework is launched."
  id      State       Bundle
  15      STARTING    com.example.serviceconsumer_1.0.0.X
  16      RESOLVED    com.example.serviceprovider_1.0.0.X

我希望看到的是,即使 bundle 16 只是“已解决”,它至少会注​​册服务。但是当我调用“bundle”命令时,它显示“没有注册服务”。

osgi> bundle 16
com.example.serviceprovider_1.0.0.X [17]
  Id=17, Status=RESOLVED    Data Root=C:\apache\apache-tomcat-.0.40\work\Catalina\localhost\examplesX\eclipse\configuration\org.eclipse.osgi\bundles\17\data
  "No registered services."
  No services in use.
  No exported packages
  Imported packages
     org.osgi.framework; version="1.7.0"<org.eclipse.osgi_3.8.0.v20120529-1548 [0]>
  No fragment bundles
  Named class space
    com.example.serivceprovider; bundle-version="1.0.0.X"[provided]
  No required bundles

也许我错过了延迟加载包和服务注册的基本概念。如果 bundle 处于“已解决”状态,它不应该连接所有“电线”吗? (即,有一个类加载器、已解析的导入和导出依赖项以及已注册的服务。)如果服务消费者尝试访问该服务,该 bundle 是否应该转换为“ACTIVE”状态?我在这里缺少什么?

最佳答案

处于 RESOLVED 状态的 Bundle 不能提供服务,它们将被 Declarative Services 忽略。你通常应该在启动时启动所有的包,即使你想要延迟加载行为。关键是要使 bundle 的激活变得便宜(或免费!),并且仅在需要时为组件的初始化付费。

默认情况下,DS 已经负责延迟激活。您无需启用或更改任何内容即可实现此目的。本质上,DS 会在注册表中发布服务条目,但它不会实际实例化您的组件(甚至加载其类),直到某些客户端尝试使用该服务。

此外,因为 DS 在需要时才加载类,OSGi 甚至不需要为 bundle 创建 ClassLoader,只要您的 bundle 没有 BundleActivator。

重申一下,您不应该试图让您的包保持在已解决状态。这样的 bundle 只能导出静态代码和资源,但不能“做”任何事情,也不能参与服务注册。

关于java - OSGi/Equinox、声明式服务和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16987681/

相关文章:

java - 不兼容 :org. codehaus.plexus。 .exception.ComponentLookupException

java - 为 Eclipse 插件导入 org.eclipse.core 包

java - 将 Equinox 3.2.1 嵌入到 WebSphere 中

tomcat - 从 Tomcat 上部署的 OSGI Equinox bundle 进行 JNDI 查找(桥接模式)

java - 如何从命令行构建 OSGi(Equinox) 项目

java - 如何从用户输入中调用图像?

java - 将输入流转换为位图

java - 使用 java 从串行端口发送带有 header 和正文的消息

java - Eclipse Juno 上的独立 OSGi (Equinox) 服务器

java - 未找到 OSGI 激活器类