根据Java系统属性,是否可以不激活OSGI声明服务?
例如,如果我使用以下属性启动Java,则我不想启动某个DS:
-DdoNOtActivate = true
我曾考虑过在特定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()方法。
有什么想法吗?
最佳答案
我曾考虑过在特定DS的激活器中读取属性,但是接下来该怎么办?通话停用?
只要返回就什么都不做。不要使用自动服务注册,而应通过激活和停用方法以编程方式注册和注销必要的OSGi服务。例如。:
private ServiceRegistration serviceReg;
@Activate
public void activate(BundleContext context) {
String sysProp = System.getProperty("doNotActivate");
if (sysProp != null && Boolean.parse(sysProp)) {
return;
}
serviceReg = context.registerService(....);
}
@Deactivate
public void deactivate() {
if (serviceReg != null) {
serviceReg.unregister();
}
}
您的组件将处于活动状态,但是如果指定了system属性,则它将不执行任何操作。
编辑
因此,myService已激活并注册,一切正常。 EventHandler似乎也已注册,但是没有事件到达我的handleEvent()方法。
请注意,您注册的服务没有服务属性。如果服务注册是自动的,则组件的所有属性都会自动添加为服务属性。如果您以编程方式注册服务,则不是这种情况。我将以以下方式更改代码:
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());
}
通过传递组件的属性,将使用与自动方法注册的属性相同的属性注册服务。