如何启动immediate = false组件?

时间:2015-08-06 15:40:26

标签: java osgi cq5 apache-felix osgi-bundle

我有以下组件:

@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) { }
}

在cq开始后注册了。这是预期的行为。

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

2 个答案:

答案 0 :(得分:3)

是的,这是非直接组件的预期行为。来自a blog post的Felix Meschberger在dev.day.com上,

  

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

     
      
  • 立即组件会立即创建   提供捆绑包已启动,可能会也可能不会提供服务

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

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

  •   

因此,如果设置immediate = false,您将拥有一个延迟组件,该组件在运行时按需激活 - 您无需自己显式启动组件。

您应该检查的主要事情是组件处于&#34;已启用状态&#34;或&#34;注册&#34; (正如你提到的那样)而不是&#34;不满意&#34; (它无法找到所需依赖项的引用。)

From the Felix documentation ...

  

<强> STATE_REGISTERED

     

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

答案 1 :(得分:-2)

@Component( enabled= false,...)

然后转到system/console/components