0

假设我有一个捆绑包想要向所有听众广播信息。考虑到我正在使用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 教程,与上面的教程类似。
  2. 观察者/可观察方法是否被认为是 OSGi 中的良好实践?
  3. 如果我想通知所有听众,我应该listener.updateData(data);为每个听众调用不同的线程,对吗?这样,我确保将同时通知所有听众。
4

2 回答 2

2

如果您的主要目标是广播信息,您也可以使用 OSGi Event Admin,felix 也有一个快速教程。通过服务处理您自己的听众可能被认为是有害的。

于 2014-09-04T11:08:26.423 回答
1

通过让其他捆绑包实现和发布侦听器服务来实现观察者是 OSGi 中的一个很好的实践。使用声明性服务来管理列表也很有效。我唯一不确定的是为每个听众使用一个线程是否有意义。问题是您在系统上创建了大量线程和大量负载。对于许多听众来说,这也可能很难扩展。所以替代方案是只使用相同的线程或使用线程池。线程池将限制系统的负载,从而使您的方法更具可扩展性。

于 2014-09-04T05:07:58.883 回答