我有一个业务需求,即作为某些处理的一部分,我们为外部管理的代码启用“插件”功能。
决定最好的方法是对@Reference
“排名”(根据不相关的算法排序)服务的列表。或多或少是这样的:
public interface ExternalProcessor {
void doSomething();
}
@Component
@Service(ImportantTaskManager.class)
public class ImportantTaskManager{
@Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = ExternalProcessor.class)
protected List<ExternalProcessor> processors;
public void doImportantStuff(){
for(ExternalProcessor processor: processors){
processor.doSomething();
}
}
}
为了简短起见,我尽可能地省略了样板,包括bind
/unbind
方法对。
现在,另一个业务需求是,如果存在实现ExternalProcessor
未绑定到主处理器的接口的服务,则我们将不执行任何类型的处理(由于任何原因:未解决的依赖关系,激活期间崩溃,缺少必需的配置等) )。我感觉这有点违背OSGi原则(OSGi仅提供可用服务,而不提供有关不可用信息的信息),但是我如何实现呢?
到目前为止,我已经提出了以下候选解决方案:
要求外部团队提供我们期望的服务数量,然后将其与我们从OSGi获得的服务进行比较-这是不可靠的
抓取所有已安装的捆绑软件以及从捆绑软件标头中获取的元xml,以查找服务定义-开始,这很费时。
grep
通过日志查找服务注册和/或失败-这似乎只是...错误。
以上任何一种解决方案是否合适?有更好的解决方案吗?我还能如何解决这个问题?我在这里想念什么?
我对安全性插件也有类似的要求。当缺少必要的安全性插件时,调用插件的代码不应运行。
我通过定义一个服务属性(如id)解决了这个问题。每个插件都有一个唯一的ID。在主代码的配置中,通过所需ID指定安全插件列表。
然后,代码将检查每个服务的ID,并仅在存在所有必需的插件时才激活主要组件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句