2014-09-04 60 views
0

假設我有一個包想要向所有聽衆廣播一個信息。考慮到我使用其中MyComponent被消耗0..N ComponentListeners聲明式服務,我想有這樣的事情:在0..n基數中綁定OSGi服務的好習慣?

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);,對吧?這樣,我確保所有聽衆都會同時收到通知。

回答

2

如果您的主要目標是廣播信息,您也可以使用OSGi Event Admin,那麼felix也有一個quick tutorial。通過服務處理您自己的聽衆可能是considered harmful

+0

我完全忘記了事件管理員,但在嘗試此操作之前,我會先閱讀完整的論文。謝謝! – 2014-09-04 20:48:04

1

通過讓其他包實現併發布監聽器服務來實現觀察者是OSGi的一個好習慣。 也使用聲明性服務來管理列表工作良好。 我不確定的唯一的事情是如果對每個偵聽器使用一個線程是有意義的。問題是你在系統上創建了很多線程和很多負載。這對很多聽衆來說也可能會嚴重縮水。所以替代方法就是使用相同的線程或使用線程池。線程池將限制系統上的負載,從而使您的方法更具可擴展性。

+0

此外,顯示的代碼不是線程安全的,但也許你爲了這個問題的簡單例子而離開了它。即使使用多線程也不能保證在「同一時間」通知所有聽衆。 – 2014-09-04 10:18:59

+0

是的,我想在實現一個線程池來限制負載,因爲我不知道有多少聽衆會收到通知。實際上,我只是想避免讓聽衆花費很長時間處理通知,因爲這會延誤其他聽衆。 但是,正如apf7188所述,使用Event Admin可能是一個好主意,不是嗎? – 2014-09-04 22:03:43

+1

事件管理員的好處是你不必管理聽衆。壞事是事件管理員發送鍵值對。所以界面看起來很少面向對象。 – 2014-09-05 04:27:32