【问题标题】:OSGI: get reference to EJB from ServiceListenerOSGI:从 ServiceListener 获取对 EJB 的引用
【发布时间】:2011-07-15 20:52:15
【问题描述】:

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

【问题讨论】:

  • 您应该在这个问题中添加“glassfish”标签。服务和 EJB 之间的集成是 Glassfish 特有的功能,因此通过适当地标记它可能会吸引了解 Glassfish 的人的注意。

标签: osgi glassfish-3 cdi ejb-3.1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你需要在MENIFEST.MF中声明Export-EJB:ALL,这会将所有EJB导出为服务,然后你可以使用@OSGiService来获取服务,具体可以参考"OSGi Application Development using GlassFish Server"

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2014-09-09
      • 2013-01-11
      • 2012-07-30
      相关资源
      最近更新 更多