【问题标题】:What would cause the @Activate method to not be invoked for Apache Felix?什么会导致不为 Apache Felix 调用 @Activate 方法?
【发布时间】:2016-10-25 01:23:08
【问题描述】:

我有一个 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 文档,我了解到@Componentimmediate=true 属性是“立即激活的”。我的问题是我的activate 方法似乎从未被调用过。从我构建项目的那一刻到我使用 OSGi 请求服务 myClass 的那一刻,我的调试器都处于开启状态,但似乎从未调用过 activate 方法。

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

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

【问题讨论】:

    标签: java osgi apache-felix


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您提供有用的信息。我在 Felix 文档中没有看到任何表明注释已被弃用的信息。鉴于组件在其所需的服务出现之前不会被激活,我想我知道我可以做些什么来开始调试。我如何知道对于给定组件哪些引用是强制性的?
    • 您需要查看我链接的 DS 规范或文档。默认情况下,@Reference 是必需的。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多