我只想在PUBLISH模式下运行我的服务组件,我需要添加额外的东西来实现这一点。
我有1个Abc接口类,这是Abc的必要条件,我想在发布模式下运行此服务组件,而不是在作者模式下运行。
代码:
@Service
public class AbcImpl implements AbcService {
.
.
.
.
}
答案 0 :(得分:7)
有几种方法可以实现这一目标:
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");
}
}
您显然必须在您公开的每个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注释。对于那些人也应该有类似的选择。