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

Ash*_*wal 1 aem

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

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

码:

@Service
public class AbcImpl implements AbcService {
    .
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 7

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

  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");
    }
}
Run Code Online (Sandbox Code Playgroud)

您显然必须检查您公开的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 {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

此解决方案使用OSGi R6注释而不是Apache Felix SCR注释.应该也有类似的选择.

请参阅:ConfigurationPolicy JavaDoc