Я пытаюсь заставить удаленные службы OSGi работать с моим существующим приложением RCP (на основе Mars). Однако, похоже, это не работает - два экземпляра моего приложения не видят службы, опубликованные в другом.
Я добавил последнюю версию ECF SDK на свою целевую платформу и добавил следующие пакеты в среду выполнения моего продукта;
- org.eclipse.ecf.discovery
- org.eclipse.ecf.provider
- org.eclipse.ecf.provider.remoteservice
- org.eclipse.ecf.sharedobject
- org.eclipse.equinox.concurrent
- org.eclipse.ecf.osgi.services.remoteserviceadmin.proxy
- org.eclipse.osgi.services.remoteserviceadmin
- org.eclipse.ecf.remoteservice.asyncproxy
- org.eclipse.ecf.remoteservice
- org.eclipse.ecf.osgi.services.distribution
- org.eclipse.ecf.provider.jmdns
- ch.ethz.iks.r_osgi.remote
- org.eclipse.ecf.provider.r_osgi
- org.eclipse.ecf.console
- org.eclipse.ecf.provider.dnssd
- org.xbill.dns
- org.eclipse.ecf.provider.discovery
В одном из моих активаторов пакетов у меня есть следующее, чтобы зарегистрировать мою службу в методе запуска ()
ServiceTracker _containerManagerServiceTracker = new ServiceTracker(_context, IContainerManager.class.getName(), null);
_containerManagerServiceTracker.open();
IContainerManager containerManager = (IContainerManager) _containerManagerServiceTracker.getService();
IContainer container = containerManager.getContainerFactory().createContainer("ecf.r_osgi.peer");
IMyService myService = new MyService();
Properties props = new Properties();
props.put(IDistributionConstants.SERVICE_EXPORTED_INTERFACES, IDistributionConstants.SERVICE_EXPORTED_INTERFACES_WILDCARD);
props.put(IDistributionConstants.SERVICE_EXPORTED_CONFIGS, "ecf.r_osgi.peer");
// register remote service
context.registerService(IMyService.class, myService, props);
Я знаю, что что-то работает, как сообщает второй экземпляр;
"WARNING: Port 9278 already in use. This instance of R-OSGi is running on port 9279"
Я также вижу одну запись, появляющуюся как «_ECFOSGIRSVC» в браузере zeroconf.
Многочисленные руководства, кажется, указывают на то, что этот сервис должен волшебным образом стать доступным на другом экземпляре. Однако ничего не появляется (запуск «служб» в консоли приложения отображает только локальные службы). Некоторые вопросы;
- Это действительно все, что нужно?
- How do I debug this?
- How do I know if the service is really exported?
- Как узнать, действительно ли другой экземпляр ищет его?
- Можно ли а) сообщить о конечной точке контейнера и «вручную» подключиться к другому экземпляру?
Существует множество руководств по «HelloService» с не совсем одинаковым содержанием, что делает начало работы очень запутанным!