【问题标题】:Do not activate OSGI declarative service depending on a java system property不要根据 java 系统属性激活 OSGI 声明式服务
【发布时间】:2015-11-11 15:12:24
【问题描述】:

是否可以根据 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() 方法。

对此有什么想法吗?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    我想过阅读特定 DS 的激活器中的属性,但接下来呢?通话停用?

    只是返回,什么都不做。不要使用自动服务注册,而是在 activate 和 deactivate 方法中以编程方式注册和取消注册必要的 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();
      }
    }
    

    您的组件将处于活动状态,但如果指定了系统属性,它将什么也不做。

    编辑

    所以 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());
    }
    

    通过传递组件的属性,服务将使用与自动方法注册时相同的属性进行注册。

    【讨论】:

    • 如何不使用自动服务注册?目前看来我的服务已自动激活并注册。可能是component.xml 中的某种属性?还有这个ServiceRegistration是什么?它是我需要添加到 component.xml 的参考吗?
    • OSGi 服务可以通过 bundleContext.registerService() 函数以编程方式安装。在这种情况下,程序员会得到一个 ServiceRegistration 实例,并且可以使用该实例的注销函数注销该服务。如果 元素未在 component.xml 中定义,则不会自动注册服务。
    • 感谢您的回答。几乎可以正常工作,但遇到了另一个问题,我更新了有关它的问题。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2011-08-08
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多