假设我有一个包,它希望向所有的侦听器广播一个信息。考虑到我使用的是声明性服务(其中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);
}
}我的问题是:
listener.updateData(data);,对吗?这样,我就可以确保所有侦听器同时得到通知。发布于 2014-09-04 11:08:26
如果您的主要目标是广播信息,您也可以使用OSGi事件管理,felix也有一个快速教程。通过服务处理自己的侦听器可能是被认为有害。
发布于 2014-09-04 05:07:58
在OSGi中,通过让其他包实现和发布侦听器服务来实现观察者是一个很好的实践。此外,使用声明性服务来管理列表也很好。我唯一不确定的是,是否对每个侦听器使用一个线程是有意义的。问题是,您在系统上创建了大量线程和大量负载。对于许多听众来说,这也可能是很糟糕的。因此,替代方案是只使用相同的线程或使用线程池。线程池将限制系统上的负载,从而使您的方法更具可伸缩性。
https://stackoverflow.com/questions/25657257
复制相似问题