Java 如何让所有服务实现给定的接口,而不仅仅是活动接口?

Java 如何让所有服务实现给定的接口,而不仅仅是活动接口?,java,osgi,aem,Java,Osgi,Aem,我有一个业务需求,作为某些处理的一部分,我们为外部管理的代码启用“插件”功能 经决定,最好的方法是@参考一个“排名”(根据不相关的算法排序)服务列表。大致是这样的: public interface ExternalProcessor { void doSomething(); } @Component @Service(ImportantTaskManager.class) public class ImportantTaskManager{ @Reference(card

我有一个业务需求,作为某些处理的一部分,我们为外部管理的代码启用“插件”功能

经决定,最好的方法是
@参考
一个“排名”(根据不相关的算法排序)服务列表。大致是这样的:

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();
        }
    }
}
公共接口外部处理器{
无效剂量();
}
@组成部分
@服务(ImportantTaskManager.class)
公共类重要任务管理器{
@引用(基数=ReferenceCardinality.OPTIONAL\u倍数,referenceInterface=ExternalProcessor.class)
受保护的列表处理器;
公共void doImportantStuff(){
用于(外部处理器:处理器){
处理器。doSomething();
}
}
}
为了简短起见,我已经编写了尽可能多的样板文件,包括
bind
/
unbind
方法对

现在,另一个业务需求是,如果有实现
ExternalProcessor
接口的服务未绑定到我们的主处理器(出于任何原因:未解析依赖项、激活期间崩溃、缺少所需配置等),我们将不执行任何类型的处理。我觉得这有点违背OSGi原则(OSGi只提供可用的服务,而不是提供不可用的服务的信息),但我如何才能做到这一点呢

到目前为止,我提出了以下解决方案:

  • 请外部团队提供我们期望的服务数量,然后将其与我们从OSGi获得的服务进行比较——这是不可靠的

  • 爬过所有已安装的bundle及其从bundle头部获取的meta-xml,查找服务定义-它是。。。首先,这很费时

  • grep
    通过日志查找服务注册和/或失败-这似乎只是。。。错


  • 上述任何一项都是解决这个问题的正确方法吗?有更好的解决方案吗?我还能如何解决这个问题?我缺少什么?

    我对安全插件也有类似的要求。当缺少必要的安全插件时,调用插件的代码不应运行

    我通过定义像id这样的服务属性来解决这个问题。每个插件都有一个唯一的id。在主代码的配置中,您可以根据需要的id指定一个安全插件列表


    然后,代码检查每个服务的ID,并仅在所有必需插件都存在时激活主组件。

    我们希望避免依靠外部团队不犯错误(向我们提供ID列表)来避免潜在的故障点,但这似乎是一个很好且干净的解决方案——如果没有其他办法,我们可能会使用它。谢谢经过仔细考虑(和一个小的需求调整),我们决定,任何出现在我们脑海中的“更好的”解决方案都只是一个“聪明的”黑客,而这个解决方案只是更好,并且是暂时的做法。标记为已接受答案-再次感谢!