Добавляю OSGI-сервис MyService
в apache karaf примерно так:
- Создайте и аннотируйте сервис и его реализацию.
public interface MyService {//...}
@OsgiServiceProvider(classes=MyService .class)
@Singleton
public class MyServiceImpl implements MyService {//...}
- Используйте сборку maven с
blueprint-maven-plugin
иmaven-bundle-plugin
для обработки аннотаций. Объявление OSGi-сервиса и его реализация приводят к файлу bundle.jar!/OSGI-INF/blueprint/autowire.xml:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
<bean id="myServiceImpl" class="com.foo.bar.MyServiceImpl"
ext:field-injection="true" init-method="init">
<property name="contextFactory" ref="initialContextFactory-"/>
</bean>
<service ref="myServiceImpl" interface="com.foo.bar.MyService"/>
</blueprint>
Этот XML известен пакету, поскольку он находится в MANIFEST.MF:
Bundle-Blueprint: OSGI-INF/blueprint/autowire.xml
- Скопируйте функцию, включая этот пакет, в karaf-home/deploy.
Теперь я хотел бы привязать эту службу к имени JNDI по соображениям совместимости. Я пытаюсь добиться этого, реализуя init()
в MyServiceImpl
и используя ServiceTracker
:
@PostConstruct
public void init() {
BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
ServiceTracker tracker = new ServiceTracker(context, this.getClass(), null) {
@Override
public Object addingService(ServiceReference reference) {
Object serviceObj = super.addingService(reference);
try {
Context c = new InitialContext();
bind(c, "java:global/com.foo.bar.bundle/MyServiceImpl!com.foo.bar.MyService", serviceObj );
}
catch (NamingException e) { e.printStackTrace(); }
return serviceObj;
}
};
tracker.open();
}
private void bind(Context ctx, String name, Object value) { //... }
К сожалению, я получаю javax.naming.NotContextException
, если выполняю поиск:
new InitialContext().lookup("java:global/com.foo.bar.bundle/MyServiceImpl!com.foo.bar.MyService");
Чтобы выяснить это, я сначала проверил, запущен ли пакет и добавлена ли служба в консоли karaf:
karaf@root()> bundle:list | grep bundle
155 | Active | 80 | 0.0.1.SNAPSHOT | bundle
karaf@root()> bundle:services 155
bundle (155) provides:
----------------------
[com.foo.bar.MyService]
Затем я перезапустил karaf с параметром отладки и установил точку останова на init()
и addedService()
. Наблюдение показало: вызывается init()
, поэтому ServiceTracker
нужно правильно добавить в бандл. Но addingService()
не звонят.
Что мне не хватает?