繁体   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