Распределенный 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)

Надеюсь, это поможет.

Другие вопросы по тегам