0

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

4

2 回答 2

0

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

于 2011-03-21T16:01:34.393 回答
0

您需要Export-EJB:ALL在 MENIFEST.MF 中声明,将所有 EJB 导出为服务,然后您可以使用@OSGiService获取服务,详细可参考“使用 GlassFish Server 开发 OSGi 应用程序”

希望这可以帮到你

于 2013-04-07T01:25:57.557 回答