我使用OSGI,Weld和Glassfish3.1
我有一个带ServiceListener的OSGI模块。在ServiceListener中,我需要将注册的服务输入到我的数据库中。
最初我想编写一个转到DB的EJB,并在ServiceListener中添加将带来EJB的EJB / EJB注入(EJB和ServiceListener在同一个包中)。
但是,lookup / 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不活动)答案 0 :(得分:0)
我为此找到了一种解决方案:添加一个启动单例EJB,它注入DAO服务并向OSGI添加一个监听器。 但是,如果有更好的方法,我仍然很好奇
答案 1 :(得分:0)
您需要在MANIFEST.MF中声明Export-EJB:ALL
,这会将所有EJB导出为服务,然后您可以使用@OSGiService
来获取服务,有关详细信息,请参阅{{3} }
希望这可以帮到你