0

我必须编写一个可以远程访问的服务。我正在使用 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,甚至可以从远程计算机上看到。“ http://192.168.0.3:9090/preview?wsdl ” 像这样。

但随之而来的是消费者。客户端 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(),然后是一个“ http://192.168.0.3:9090/preview/hello " call 应该可以工作......但它没有。我什至不知道,如何调试这个。(没有远程的东西,在本地,在同一个容器中,方法调用正在工作)

任何帮助都会很好!谢谢!

4

3 回答 3

0

一个更简单的解决方案是使用基于 zookeeper 的发现。服务器节点会将其导出的服务发布到 zookeeper,并且一旦捆绑请求此类服务,消费者节点将为这些服务创建准备好使用的 OSGi 服务。

于 2016-04-26T09:55:24.673 回答
0

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

我希望这有帮助。

于 2016-04-26T13:09:16.727 回答
0

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

于 2016-10-03T22:48:57.667 回答