2013-04-23 109 views
1

考慮從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.REGISTERED事件的可能性?在第1行和第2行之前註冊服務監聽器後,服務註冊自身,導致監聽器接收到ServiceEvent.REGISTERED通知。在所有服務引用中,在第2行中引用了該服務,導致通知被接收兩次。這種情況可能嗎?如果是,那麼可以做些什麼來避免這種情況?

回答

6

使用ServiceTracker而不是嘗試使用「原始」API執行此操作。 ServiceTracker將爲您正確處理這些問題。

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

+0

我同意。我想我想知道的是,如果這種情況甚至可能? – nadirsaghar 2013-04-29 19:40:03

+0

是的。這可能就是Service Tracker和DS存在的原因。 – 2013-05-01 10:41:03