Вот решение: среда выполнения приложений OSGi обрабатывает удаленные сервисы иначе, чем локальные, из-за различий в семантике вызова по умолчанию (локальная передача по ссылке или удаленная передача по значению). Чтобы приложение случайно не вызвало экспортированную службу, которая предназначена только для вызовов по значению, оно скрыто от локальных поисков.
Решение этой проблемы состоит в том, чтобы экспортировать один и тот же компонент дважды, один раз для удаленных вызовов, а второй для локальных. Другими словами, вы бы добавили еще один элемент <service />
с той же конфигурацией, но без свойства service.exported.interfaces
.
<service ranking="0" id="TicketServiceExport" interface="com.example.b2.service.TicketService" ref="TicketServiceBean">
<service-properties>
<entry key="service.exported.interfaces" value="*" />
</service-properties>
</service>
<service ranking="0" id="TicketService" interface="com.example.b2.service.TicketService" ref="TicketServiceBean"/>
На самом деле в веб-сфере также есть консоль osgi, которую можно найти в [local websphere installation]/profiles/[profileName]/bin/osgiApplicationConsole.bat
. После запуска help()
выдает список команд. Чтобы просмотреть импортированные сервисы из SCA, вы сначала подключаетесь к своему приложению (например, connect(2)
, где номер приложения указан в результатах команды list()
). Затем вы можете сделать services("(service.imported=true)")
, чтобы увидеть сервисные прокси, которые были добавлены SCA. Команда services()
выведет список всех служб в приложении.