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

CptBartender

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

决定最好的方法是对@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仅提供可用服务,而不提供有关不可用信息的信息),但是我如何实现呢?

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

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

  2. 抓取所有已安装的捆绑软件以及从捆绑软件标头中获取的元xml,以查找服务定义-开始,这很费时。

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

以上任何一种解决方案是否合适?有更好的解决方案吗?我还能如何解决这个问题?我在这里想念什么?

克里斯汀·施耐德(Christian Schneider)

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

我通过定义一个服务属性(如id)解决了这个问题。每个插件都有一个唯一的ID。在主代码的配置中,通过所需ID指定安全插件列表。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为所有页面提供静态文件,而不仅仅是少数

开始,如何获得所有触摸,而不仅仅是首先还是最后?

Tensorflow,如何访问RNN的所有中间状态,而不仅仅是最后一个状态

Fabric Answers事件:如何查看类别属性的所有值,而不仅仅是前十名

使IntelliJ标记所有参数,而不仅仅是String参数

预览所有上传的照片,而不仅仅是一张

为什么要更改所有服务,而不仅仅是if条件服务?

Xpath下标返回所有节点,而不仅仅是请求的节点

如何使用jQuery cookie记住网站所有URL的触发类,而不仅仅是页面

搜索所有iBeacon,而不仅仅是使用特定的UUID

如何将Javascript函数应用于所有Tumblr帖子,而不仅仅是最新的帖子?

如何从所有div中(不仅仅是同级兄弟)中删除带有jQuery的类?

cp -u复制所有文件,而不仅仅是新文件

获取所有重复的记录,而不仅仅是它们的列表

如何显示所有结果,而不仅仅是代表计算器中的一个

如何使用puppet的无人值守升级模块安装所有升级(不仅仅是安全性)

egrep 输出所有内容,而不仅仅是与列表中的模式匹配的行

如何为我的所有 gradle 项目(不仅仅是子项目)共享构建代码脚本

跳过给定类的所有后代(不仅仅是直接子代)的 jQuery 选择器

如何保存所有绑定的数据,而不仅仅是可见页面的数据

如何在django中获取相关模型的所有字段而不仅仅是id

为什么这个 SUM 是所有分数,而不仅仅是最好的 5 分?

ExpectedObjects 比较具体的对象,而不仅仅是接口

如何在c#中获取网站的所有内容而不仅仅是网页

如何实现返回地址的功能,而不仅仅是获取地址?

如何更改 Jackson 以检测 POJO 中的所有字段,而不仅仅是公共字段?

如何使用 django 使 celery beat 任务适用于所有对象,而不仅仅是单个对象?

删除按钮删除所有子项,而不仅仅是带有键的子项

如何按多列对所有值进行排序,而不仅仅是重复 - python