簡體   English   中英

正確實施白板模式?

[英]Implementing Whiteboard pattern the right way?

請考慮來自http://www.knopflerfish.org/osgi_service_tutorial.html#best的以下代碼段,該代碼段解釋了白板模式

ServiceListener sl = new ServiceListener() {
public void serviceChanged(ServiceEvent ev) {
  ServiceReference sr = ev.getServiceReference();
  switch(ev.getType()) {
  case ServiceEvent.REGISTERED:
    {
          registerServlet(sr);
    }
    break;
  case ServiceEvent.UNREGISTERING:
    {
          unregisterServlet(sr);
    }
    break;
  }
}
  };

String filter = "(objectclass=" + HttpServlet.class.getName() + ")";
try {
  bc.addServiceListener(sl, filter); // -- 1
  ServiceReference[] srl = bc.getServiceReferences(null, filter); // -- 2
  for(int i = 0; srl != null && i < srl.length; i++) {
sl.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
                   srl[i]));
  }
} catch (InvalidSyntaxException e) { 
  e.printStackTrace(); 
}

是否有可能在第1行和第2行之間復制ServiceEvent.located事件? 在第1行中注冊了服務偵聽器之后,在第2行之前,服務進行了自我注冊,導致偵聽器接收ServiceEvent.located通知。 在所有服務引用中的第2行中,是對該服務的引用,導致兩次收到通知。 這種情況可能嗎? 如果是,那么如何避免這種情況?

使用ServiceTracker,而不要嘗試使用“原始” API來執行此操作。 ServiceTracker將為您正確處理這些問題。

更好的是使用聲明式服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM