什么会导致Apache Felix不调用@Activate方法?

时间:2016-06-22 22:25:11

标签: java osgi apache-felix

我有一个Apache Felix组件,其定义如下:

...
@Component(immediate=true)

@Service
public class myClass implements myClassInterface {
    ...
    @Activate
    public void activate(final Map<String, Object> properties) {
        //Do activation stuff
    }
    ...
}

通过阅读@Component@Activate注释(http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html#component)上的Apache Felix文档,我了解到immediate=true的{​​{1}}属性已被激活立即”。我的问题是我的@Component方法似乎永远不会被调用。从我构建项目的那一刻起,我就开始使用调试器,直到我使用OSGi请求服务activate,但似乎永远不会调用myClass方法。

所以,我的问题有几个层次: 告诉我activate属性导致组件“立即激活”并没有给我足够的信息。这是否意味着组件在构建项目后立即激活,在创建immediate=true实例后立即激活,或者在OSGi包请求服务myClass后立即激活? 2.尽管我使用了myClass,是否有任何可能导致我的activate方法无法被调用的内容?如果是这样,我该怎么做才能解决问题?

提前感谢您的帮助。如果我需要提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

Immediate = false表示只有在另一个组件请求时才激活该组件。 Immediate = true表示一旦所有强制引用都存在,它就会被激活。

因此,如果您的组件未激活,则可能不存在所需的服务。您可以使用gogo shell中的scr命令查看组件的状态。

另一件事是定义用于发布服务的接口。我不确定felix SCR注释,但如果类没有实现任何接口,则需要使用DS注释设置@Component(service = myClass.class)。

顺便说一下。您应该切换到标准DS注释。见http://enroute.osgi.org/doc/217-ds.html。 felix的现在已被弃用。