【发布时间】:2018-03-25 13:08:32
【问题描述】:
我只想在 PUBLISH 模式下运行我的服务组件,我需要添加什么额外的东西来实现这一点。
我有 1 个 Abc 接口类,这是 Abc 的实现,我想在发布模式下运行这个服务组件,而不是在作者模式下。
代码:
@Service
public class AbcImpl implements AbcService {
.
.
.
.
}
【问题讨论】:
标签: aem
我只想在 PUBLISH 模式下运行我的服务组件,我需要添加什么额外的东西来实现这一点。
我有 1 个 Abc 接口类,这是 Abc 的实现,我想在发布模式下运行这个服务组件,而不是在作者模式下。
代码:
@Service
public class AbcImpl implements AbcService {
.
.
.
.
}
【问题讨论】:
标签: aem
有几种方法可以实现这一点:
SlingSettingsService 确定服务是否在发布实例上运行。此选项会使您的代码有点难看,并且根据您的服务提供的public API 的数量,它会添加合理数量的代码。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% 确定这是否有效。
注意:正如用户 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 注释。也应该有类似的选项可供选择。
【讨论】: