是否有可能不根据java系统属性激活OSGI声明服务?
例如,如果我使用以下属性启动java,我不想启动某个DS: -DdoNOtActivate =真
我考虑过阅读特定DS的激活器中的问题,但接下来是什么?呼叫停用?
编辑:
好的,我得到了服务本身,感谢Balazs通过程序化激活的回答,但我的服务还为org.osgi.service.event.EventHandler提供了一个接口,那部分不起作用。我在component.xml中有这个:
<service>
<provide interface="org.osgi.service.event.EventHandler" />
<provide interface="com.example.test.MyService" />
</service>
<property name="event.topics">
test
</property>
所以我删除了整个服务部分并离开了event.topics部分,在我的java类激活器中添加了以下内容:
myServiceReg = context.registerService(this.getClass().getName(), this, null);
eventHandlerReg = context.registerService(EventHandler.class.getName(), this, null);
因此myService已激活并注册,一切正常。 EventHandler似乎也已注册,但没有事件到达我的handleEvent()方法。
有关于此的任何想法吗?
答案 0 :(得分:1)
我考虑过阅读特定DS的激活器中的问题,但接下来是什么?呼叫停用?
回来什么都不做。不要使用自动服务注册,而是在activate和deactivate方法中以编程方式注册和注销必要的OSGi服务。 E.g:
public void activate(ComponentContext cc) {
BundleContext bc = cc.getBundleContext();
myServiceReg = bc.registerService(this.getClass().getName(), this, cc.getProperties());
eventHandlerReg = bc.registerService(EventHandler.class.getName(), this, cc.getProperties());
}
您的组件将处于活动状态,但如果指定了系统属性,则它将不执行任何操作。
修改强>
因此myService已激活并注册,一切正常。 EventHandler似乎也已注册,但没有事件到达我的handleEvent()方法。
请注意,您注册的服务没有服务属性。如果服务注册是自动的,则组件的所有属性将自动添加为服务属性。如果以编程方式注册服务,则情况并非如此。我会以下列方式更改代码:
.*\/(\d+)
通过传递组件的属性,服务将使用与使用自动方法注册的属性相同的属性进行注册。