java - 以正确的方式实现白板模式?

标签 java osgi

考虑以下来自 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(); 
}

是否有可能在两者之间复制 ServiceEvent.REGISTERED 事件 1 号线和 2 号线?在第 1 行和第 2 行之前注册服务监听器之后,服务会自行注册,导致监听器接收到 ServiceEvent.REGISTERED 通知。在所有服务引用中的第 2 行是对该服务的引用,导致收到两次通知。这种情况可能吗?如果是,那么可以做些什么来避免这种情况?

最佳答案

使用 ServiceTracker而不是尝试使用“原始”API 来做到这一点。 ServiceTracker将为您妥善处理这些问题。

更好的方法是使用声明式服务。

关于java - 以正确的方式实现白板模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16176006/

相关文章:

java - openrdf 芝麻模型中的多个过滤器

java - 如何在 Elasticsearch Java 高级客户端 6.8 的响应中只获取失败的文档

java - Maven 故障保护不运行测试

java - 使用 spring WebServiceTemplate 和 Jaxb2Marshaller 时的线程安全

java - db4o 和 OSGi - 重新启动后数据库为空

java - 在 OSGi Bundle 中使用 JavaCompiler

java - 获取 Java 的 Class<? 的行为扩展 .NET 中的 Map>

java - 无法读取 biz.aQute.bnd :bnd-maven-plugin:jar:3. 3.0 的 Artifact 描述符:

java - 多线程捆绑和服务实例

java - OSGi Java Spark 不同模块中的多个端点声明?