java - 以 0..n 基数绑定(bind) OSGi 服务的良好实践?

标签 java osgi declarative-services

假设我有一个包想要向所有监听器广播信息。考虑到我正在使用声明性服务,其中 MyComponent 消耗 0..n ComponentListeners,我会得到如下内容:

public class MyComponent {

    private List<ComponentListener> listeners;
    private String data;

    public MyComponent() {
        listeners = new ArrayList<>();
    }

    // Someone else will call this
    public void updateData(String newData) {
        data = newData;
        notifyAll(data);
    }

    // Broadcasts the data to all listeners
    private void notifyAll(String data) {
        for (ComponentListener listener : listeners) {
            listener.updateData(data);
        }
    }

    // Declarative Service binding methods
    public void bindComponentListener(ComponentListener cl) {
        listeners.add(cl);
    }

    public void unbindComponentListener(ComponentListener cl) {
        listeners.remove(cl);
    }
}

我的问题是:

  1. 是否建议使用 0..n 基数?我发现的唯一例子来自 Apache Felix tutorial ,与上面的类似。
  2. 观察者/可观察方法被认为是 OSGi 中的良好实践吗?
  3. 如果我想通知所有监听器,我应该在每个监听器的不同线程中调用 listener.updateData(data);,对吗?这样,我可以确保所有听众都会同时收到通知。

最佳答案

如果您的主要目标是广播信息,您也可以使用 OSGi 事件管理器,felix 有一个 quick tutorial以及。通过服务处理您自己的监听器可能是 considered harmful .

关于java - 以 0..n 基数绑定(bind) OSGi 服务的良好实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25657257/

相关文章:

java - 验证 OSGi list

java - 这个 "imported in"maven-bundle-plugin OSGI 警告是什么意思?

java - 如何使用声明式服务管理多个服务实例?

osgi - 如何在部署在 WAS 8.0 中的自己的 OSGi 应用程序中启动特定包?

java - 在 jooq 的条件表达式中使用自定义数据类型

java - eclipse |尝试在 Ubuntu 下打开 sh 文件时权限被拒绝

Java,JoptionPane : the yes-no dialog keeps on showing

Java:需要站点用户之间的有效通知

java - UTF-8 不支持来自日志子系统的消息,Fuse ESB 4.4

java - 对 Karaf 的服务状态不满意(引用) - 错误在哪里? (OSGi、声明式服务、注释)