分布式OSGi - 使用服务

时间:2016-04-25 20:36:55

标签: java web-services wsdl osgi dosgi

我必须编写一个可以远程访问的服务。 我使用的是cxf-dosgi-ri-singlebundle-distribution-1.4.0。 所以我用这些属性制作了API,然后是实现:

Dictionary<String, String> restProps = new Hashtable<String, String>();

restProps.put("service.exported.interfaces", "*");
restProps.put("service.exported.configs", "org.apache.cxf.ws");
restProps.put("org.apache.cxf.ws.address", "http://192.168.0.3:9090/preview");
bundleContext.registerService(Preview.class.getName(), new PreviewService(),restProps);

如果我部署捆绑包,(在部署api和d-osgi jar之后),我可以在浏览器中看到WSDL,甚至是远程计算机。    &#34; http://192.168.0.3:9090/preview?wsdl&#34;像这样。

然后是消费者。客户端jar中的OSGI-INF / remote-service / remote-services.xml包含:

<endpoint-descriptions xmlns="http://www.osgi.org/xmlns/rsa/v1.0.0">
<endpoint-description>
<property name="objectClass">
    <array>
      <value>com.liferay.preview.api</value>
    </array>
</property>
<property name="endpoint.id">http://192.168.0.3:9090/preview</property>
<property name="service.imported.configs">org.apache.cxf.ws</property>
</endpoint-description>
</endpoint-descriptions>

我可以部署捆绑包(在部署d-osgi捆绑包和API之后),但我总是回到空引用。 教程总是使用这样的代码

 st = new ServiceTracker(bundleContext, MyService.class.getName(), null) {
  @Override
  public Object addingService(ServiceReference reference) {
    Object svc = bundleContext.getService(reference);
    if (svc instanceof MyService) {
      printServiceInfo((MyService) svc);
    }

    return super.addingService(reference);
  } 
};
st.open();

但是我使用Liferay 7,我无法使用它(没有ServiceTracker的构造函数 - 我只能从Registry实例中获取ServiceTracker实例)

OSGi容器是Felix。

我已经在某处读过,如果我可以访问上面看到的WSDL描述, 让我们说,我的API中有一个方法hello(),然后是a &#34; http://192.168.0.3:9090/preview/hello&#34;电话应该工作......但它没有。 我甚至不知道如何调试这个。 (没有远程事物,在本地,在同一容器中,方法调用正在运行)

任何帮助都可以顺利进行!谢谢!

3 个答案:

答案 0 :(得分:0)

更简单的解决方案是使用基于zookeeper的发现。服务器节点将发布它导出到zookeeper的服务,并且只要捆绑包请求这样的服务,消费者节点就会为这些服务创建现成的OSGi服务。

答案 1 :(得分:0)

Riena Communication发布和绑定远程服务的复杂性较低。它使用hessian作为通信协议。它与soap相比真的很快,因为它基于二进制的协议(不是xml)

我希望这会有所帮助。

答案 2 :(得分:0)

您应该使用基于Apache CXF的Liferay SOAP Extender。您将找到Liferay开发者网络的一个示例。