Java 以0..n基数绑定OSGi服务的良好实践?

Java 以0..n基数绑定OSGi服务的良好实践?,java,osgi,declarative-services,Java,Osgi,Declarative Services,假设我有一个bundle,它想向所有的侦听器广播一个信息。考虑到我使用的是声明性服务,MyComponent正在使用0..nComponentListeners,我会有如下内容: public class MyComponent { private List<ComponentListener> listeners; private String data; public MyComponent() { listeners = new Ar

假设我有一个bundle,它想向所有的侦听器广播一个信息。考虑到我使用的是声明性服务,
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);
    }
}
公共类MyComponent{
私人名单听众;
私有字符串数据;
公共MyComponent(){
侦听器=新的ArrayList();
}
//其他人会叫这个
公共void updateData(字符串newData){
数据=新数据;
通知所有(数据);
}
//将数据广播到所有侦听器
私有void notifyAll(字符串数据){
for(ComponentListener:侦听器){
listener.updateData(数据);
}
}
//声明性服务绑定方法
公共无效bindComponentListener(ComponentListener cl){
添加(cl);
}
公共void取消绑定ComponentListener(ComponentListener cl){
删除(cl);
}
}
我的问题是:

  • 建议使用0..n基数吗?我发现的唯一一个例子是一个类似于上面的例子
  • 在OSGi中,观察者/可观察的方法被认为是一种良好的实践吗
  • 如果我想通知所有监听器,我应该调用
    listener.updateData(数据),对吗?这样,我就可以确保所有的听众都能同时得到通知

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

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

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

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

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

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

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

    如果您的主要目标是广播信息,您也可以使用OSGi事件管理器,felix也有一个。通过服务处理您自己的侦听器可能是不安全的。

    此外,所显示的代码不是线程安全的,但为了简单起见,您可能忽略了这一点。即使使用多个线程也不能保证同时通知所有侦听器。是的,我在考虑实现一个线程池来限制负载,因为我不知道有多少侦听器会收到通知。实际上,我只是想避免让一个侦听器处理通知需要很长时间,因为这会延迟其他侦听器。然而,正如apf7188所提到的,使用事件管理器可能是一个好主意,不是吗?事件管理器的好处是您不必管理侦听器。糟糕的是事件管理员发送键值对。因此,界面看起来不像面向对象的。此外,所显示的代码不是线程安全的,但为了简化本问题中的示例,您可能忽略了这一点。即使使用多个线程也不能保证同时通知所有侦听器。是的,我在考虑实现一个线程池来限制负载,因为我不知道有多少侦听器会收到通知。实际上,我只是想避免让一个侦听器处理通知需要很长时间,因为这会延迟其他侦听器。然而,正如apf7188所提到的,使用事件管理器可能是一个好主意,不是吗?事件管理器的好处是您不必管理侦听器。糟糕的是事件管理员发送键值对。那么接口就是loo