Распределенный OSGi - Потребление услуг
Я должен написать сервис, к которому можно получить удаленный доступ. Я использую 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 и jar-файла d-osgi) я смогу увидеть WSDL в браузере даже с удаленного компьютера. " http://192.168.0.3:9090/preview?wsdl" вот так.
Но потом приходит потребитель. В банке клиента находится файл 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 - я могу получить только экземпляр ServiceTracker из экземпляра Registry)
Контейнером OSGi является Феликс.
Я где-то читал, что если я могу получить доступ к описанию WSDL, как показано выше, и, скажем, в моем API есть метод hello (), то " http://192.168.0.3:9090/preview/hello"вызов должен работать... но это не так. Я даже не знаю, как это отладить. (Без удаленной вещи, локально, в том же контейнере, вызов метода работает)
Любая помощь может прийти хорошо! Спасибо!
3 ответа
Более простым решением было бы использовать открытие на основе zookeeper. Узел сервера опубликует сервисы, которые он экспортирует, в zookeeper, а узел-потребитель создаст для них готовые к использованию сервисы OSGi, как только пакет запросит такую услугу.
Вам следует использовать Liferay SOAP Extender, основанный на Apache CXF. Вы найдете пример для сети разработчиков Liferay.
Riena Communication менее сложна для публикации и привязки удаленных сервисов. Он использует гессиан в качестве протокола связи. это действительно быстро по сравнению с мылом, так как его двоичный протокол (не XML)
Надеюсь, это поможет.