如何启动immediate = false组件?

gst*_*low 2 java osgi apache-felix osgi-bundle aem

我有以下组件:

@Component(
    label = "Service name",
    description = "Service description",
    metatype = true,
    immediate = false)
@Properties({
    @Property(
            label = "My Label"
            name = "property-name",
            value = "my value",
            propertyPrivate = true
    )
})
@Service
public class SampleServiceImpl implements SampleService {
    private final Logger log = 
        LoggerFactory.getLogger(this.getClass());

    /**
     * OSGi Properties *
     */
    private static final String DEFAULT_SAMPLE = "hello!";
    private String mySample = DEFAULT_SAMPLE;
    @Property(label = "Prop name", 
              description = "Prop description", 
              value = DEFAULT_SAMPLE)
    public static final String PROP_SAMPLE = "sample";

    ...

    @Activate
    protected void activate(final Map<String, String> config) { 
        mySample = PropertiesUtil.toString(config.get(PROP_SAMPLE), DEFAULT_SAMPLE);
    }

    @Deactivate
    protected void deactivate(final Map<String, String> config) { }
}
Run Code Online (Sandbox Code Playgroud)

它在 cq 启动后注册。这是预期的行为。

如何开始呢?我找不到这个界面。

ano*_*ave 5

是的,这是非直接组件的预期行为。来自Felix Meschberger 在 dev.day.com 上的博客文章,

\n\n
\n

OSGi 声明式服务规范定义了三种类型的组件:

\n\n
    \n
  • 直接组件在提供的捆绑包启动时立即创建,并且可能会也可能不会提供服务

  • \n
  • 延迟组件提供服务,但仅在服务使用者使用时才创建。

  • \n
  • 工厂组件是通过调用为组件注册的组件工厂服务的 ComponentFactory.newInstance(Dictionary) 方法按需创建的。

  • \n
\n
\n\n

因此,如果您设置immediate = false,您将拥有一个延迟组件,该组件由运行时 \xe2\x80\x94 按需激活,您不需要自己显式启动该组件。

\n\n

您应该检查的主要内容是组件处于“已启用”或“已注册”状态(正如您提到的那样)而不是“不满意”(在这种情况下找不到对其依赖项的引用)需要)。

\n\n

来自 Felix 文档\xe2\x80\xa6

\n\n
\n

状态_已注册

\n\n

该组件已成功激活,但在首次使用时是一个等待实例化的延迟组件或服务工厂组件(值为 32)。

\n
\n