我正在尝试使用声明式服务来创建一个为另一个包提供功能的服务包。但是,我希望我的服务提供程序包在需要时才启动。让我描述一下我的情况。
有两个捆绑包:
-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"/>
当这两个捆绑包在启动时都处于“活动状态”时,服务消费者与服务提供者声明的服务进行通信就没有问题。当我尝试让服务提供商以懒惰的方式启动时,就会出现问题。
在服务提供者设置为延迟加载之后,这就是我在 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
我希望看到的是,即使捆绑 16 只是“已解决”,它至少会注册的是服务。但是当我调用“捆绑”命令时,它会显示“没有注册服务”。
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
也许我错过了延迟加载包和服务注册的基本概念。如果捆绑包处于“已解决”状态,它不应该连接所有“电线”吗?(即,有一个类加载器、解析的导入和导出依赖项以及注册的服务。)如果服务消费者尝试访问服务,该捆绑包不应该转换到“活动”状态吗?我在这里缺少什么?