如何仅在AEM / CQ5中的发布实例中运行任何组件服务?

时间:2018-03-25 13:08:32

标签: aem cq5

我只想在PUBLISH模式下运行我的服务组件,我需要添加额外的东西来实现这一点。

我有1个Abc接口类,这是Abc的必要条件,我想在发布模式下运行此服务组件,而不是在作者模式下运行。

代码:

@Service
public class AbcImpl implements AbcService {
    .
    .
    .
    .
}

1 个答案:

答案 0 :(得分:7)

有几种方法可以实现这一目标:

  1. 将此服务放在另一个捆绑包中,并仅在发布实例中部署此捆绑包。这显然会增加部署的复杂性。
  2. 使用SlingSettingsService确定服务是否在发布实例上运行。此选项会使您的代码变得更加丑陋,并且根据您的服务提供的public API数量,它会添加合理数量的代码。
  3. 如果服务使用配置,则设置configurationPolicy = ConfigurationPolicy.REQUIRE有一个简洁的“技巧”,并且仅在您希望服务启动的那些环境上提供配置。如果仅为发布实例提供配置,但不为作者实例提供配置,则服务仅在发布实例上启动。如果您的服务没有配置,您可以进行“假”配置,例如添加“启用”标志以启用和禁用该服务。
  4. 选项2的代码示例:

    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Reference;
    import org.apache.sling.settings.SlingSettingsService;
    
    @Component
    public class MyService {
    
        @Reference
        private SlingSettingsService slingSettingsService;
    
        private boolean isPublish() {
            return this.slingSettingsService.getRunModes().contains("publish");
        }
    }
    

    您显然必须在您公开的每个isPublish方法中检查public。选项可能是在服务的activate方法中检查此项,并在isPublish() == false时抛出异常。但我不能100%确定这是否合适。

    请参阅:SlingSettingService JavaDoc

    注意:正如用户Abhishek在评论中所提到的,这可能会被视为代码气味(Source - Twitter.com)。

    选项3的代码示例:

    import org.osgi.service.component.annotations.Component;
    import org.osgi.service.component.annotations.ConfigurationPolicy;
    
    @Component(configurationPolicy = ConfigurationPolicy.REQUIRE)
    public class AbcImpl implements AbcService {
        [...]
    }
    

    此解决方案使用OSGi R6注释而不是Apache Felix SCR注释。对于那些人也应该有类似的选择。

    请参阅:ConfigurationPolicy JavaDoc