OSGI:从ServiceListener获取对EJB的引用

时间:2011-03-15 14:48:03

标签: osgi glassfish-3 cdi ejb-3.1

我使用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不活动)

2 个答案:

答案 0 :(得分:0)

我为此找到了一种解决方案:添加一个启动单例EJB,它注入DAO服务并向OSGI添加一个监听器。 但是,如果有更好的方法,我仍然很好奇

答案 1 :(得分:0)

您需要在MANIFEST.MF中声明Export-EJB:ALL,这会将所有EJB导出为服务,然后您可以使用@OSGiService来获取服务,有关详细信息,请参阅{{3} }

希望这可以帮到你