【问题标题】:How to run any component service in publish instance only in AEM/CQ5?如何仅在 AEM/CQ5 中在发布实例中运行任何组件服务?
【发布时间】:2018-03-25 13:08:32
【问题描述】:

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

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

代码:

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

【问题讨论】:

    标签: aem


    【解决方案1】:

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

    1. 将此服务放在不同的捆绑包中,并仅在您的发布实例中部署此捆绑包。这显然会增加部署的复杂性。
    2. 使用SlingSettingsService 确定服务是否在发布实例上运行。此选项会使您的代码有点难看,并且根据您的服务提供的public API 的数量,它会添加合理数量的代码。
    3. 如果服务使用配置,则有一个巧妙的小“技巧”​​来设置configurationPolicy = ConfigurationPolicy.REQUIRE,并且只在您希望服务启动的环境中提供配置。如果您仅为发布实例而不为作者实例提供配置,则服务将仅在发布实例上启动。如果您的服务没有配置,您可以制作“假”配置,例如添加“启用”标志来启用和禁用服务。

    选项 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");
        }
    }
    

    您显然必须在您公开的每个public 方法中检查isPublish。选项可能是在您的服务的activate 方法中检查这一点,如果isPublish() == false 则抛出异常。但我不能 100% 确定这是否有效。

    见:SlingSettingService JavaDoc

    注意:正如用户 Abhishek 在 cmets 中提到的,这可能被视为代码异味 (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

    【讨论】:

    • 选项 2 似乎违反了最佳做法。 twitter.com/joerghoh/status/976496045034213376
    • @Abhishek 是的。确实。这是一个很好的观点。我个人也不喜欢这种方法。一般来说,我尽量避免编写只能在作者或出版商上运行的服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多