[英]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.