我使用 OSGI、Weld 和 Glassfish3.1
我有一个带有 ServiceListener 的 OSGI 模块。在 ServiceListener 中,我需要将注册的服务输入到我的数据库中。
最初我想写一个 EJB 去 DB,并在 ServiceListener 添加查找/EJB 注入,这将带来 EJB(EJB 和 ServiceListener 在同一个包中)。
但是查找/EJB 注入不起作用:
@EJB
private AdminService adminService;
private class MyServiceListener implements ServiceListener {
private AdminService adminService;
public MyServiceListener(){
adminService = (AdminService) ctx.lookup("java:global/com.war_1.0.0.SNAPSHOT/AdminService");
...
}
public synchronized void serviceChanged(ServiceEvent event) {
switch (event.getType()) {
case ServiceEvent.REGISTERED:
ServiceReference reference = event.getServiceReference();
adminService.installService(...);
break;
default:
break;
}
}
我还尝试将 EJB 作为 OSGI 服务,但没有成功。
有没有办法解决这个问题?也许我不应该用 ServiceListener 来做?
谢谢你
UPD:我找到了一种解决方案:添加一个启动单例 EJB,它注入 DAO 服务并向 OSGI 添加一个侦听器,但它从激活器的静态成员中获取 bundleContext。但它有时会抛出 IllegalStateException (bundleContext 不活动)