我必须编写一个可以远程访问的服务。 我使用的是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;电话应该工作......但它没有。 我甚至不知道如何调试这个。 (没有远程事物,在本地,在同一容器中,方法调用正在运行)
任何帮助都可以顺利进行!谢谢!
答案 0 :(得分:0)
更简单的解决方案是使用基于zookeeper的发现。服务器节点将发布它导出到zookeeper的服务,并且只要捆绑包请求这样的服务,消费者节点就会为这些服务创建现成的OSGi服务。
答案 1 :(得分:0)
Riena Communication发布和绑定远程服务的复杂性较低。它使用hessian作为通信协议。它与soap相比真的很快,因为它基于二进制的协议(不是xml)
我希望这会有所帮助。
答案 2 :(得分:0)
您应该使用基于Apache CXF的Liferay SOAP Extender。您将找到Liferay开发者网络的一个示例。