在JBoss7的OSGi包中注入HttpService

在JBoss7的OSGi包中注入HttpService,osgi,jboss7.x,Osgi,Jboss7.x,我有一个JBoss 7.1.2应用服务器正在运行,现在我想在其中部署一个OSGi捆绑包来注册一个servlet。(有点像Hello World,但通过servlet) 也许可以通过WAB将其归档,但正如在OSGi中一样,我认为它也应该在一个简单的非WAB包中工作 我用激活器创建了一个包,如下所示: snip.. public void start(BundleContext bundleContext) throws Exception { ServiceReferenc

我有一个JBoss 7.1.2应用服务器正在运行,现在我想在其中部署一个OSGi捆绑包来注册一个servlet。(有点像Hello World,但通过servlet)

也许可以通过WAB将其归档,但正如在OSGi中一样,我认为它也应该在一个简单的非WAB包中工作

我用激活器创建了一个包,如下所示:

snip..
    public void start(BundleContext bundleContext) throws Exception {
        ServiceReference<?> httpServiceReference = bundleContext.getServiceReference(HttpService.class.getName());
        System.out.println("ref: " + httpServiceReference);

        HttpService httpService = (HttpService) context.getService(httpServiceReference);
        System.out.println(httpService.getClass().getName());

        try {
            httpService.registerServlet("testservlet", new MyServlet() , null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
snip。。
public void start(BundleContext BundleContext)引发异常{
ServiceReference httpServiceReference=bundleContext.getServiceReference(HttpService.class.getName());
System.out.println(“ref:+httpserviceference”);
HttpService HttpService=(HttpService)context.getService(httpServiceReference);
System.out.println(httpService.getClass().getName());
试一试{
registerServlet(“testservlet”,new MyServlet(),null,null);
}捕获(例外e){
e、 printStackTrace();
}
}
部署并启动捆绑包后,httpServiceReference为
null
。 我觉得这很奇怪,因为当我看felix web控制台时,实际上有可用的HtttpService。(来自pax网站)

有人知道为什么我的引用在这里是空的吗?
谢谢

我认为你犯了经典的OSGi错误。在
start(BundleContext)
方法中,假设HttpService已经启动,您将获得对它的引用。OSGi容器以某种顺序启动包。如果您的应用程序包在注册
HttpService
的包之前启动,您将获得一个
null
引用。我怀疑这就是正在发生的事情。您最好改用
ServiceTracker

public void start(BundleContext bundleContext) throws Exception {       
    ServiceTracker httpServiceTracker = new ServiceTracker(bundleContext, HttpService.class, new ServiceTrackerCustomizer() {

        @Override
        public Object addingService(ServiceReference srf) {
            HttpService httpService = bundleContext.getService(srf);
              try {
                    httpService.registerServlet("testservlet", new MyServlet() , null, null);
                } catch (Exception e) {
                    e.printStackTrace();
                }

        }

        @Override
        public void modifiedService(ServiceReference arg0, Object arg1) {

        }

        @Override
        public void removedService(ServiceReference arg0, Object arg1) {

        }

    });

    httpServiceTracker.open();
}

我认为你犯了经典的OSGi错误。在
start(BundleContext)
方法中,假设HttpService已经启动,您将获得对它的引用。OSGi容器以某种顺序启动包。如果您的应用程序包在注册
HttpService
的包之前启动,您将获得一个
null
引用。我怀疑这就是正在发生的事情。您最好改用
ServiceTracker

public void start(BundleContext bundleContext) throws Exception {       
    ServiceTracker httpServiceTracker = new ServiceTracker(bundleContext, HttpService.class, new ServiceTrackerCustomizer() {

        @Override
        public Object addingService(ServiceReference srf) {
            HttpService httpService = bundleContext.getService(srf);
              try {
                    httpService.registerServlet("testservlet", new MyServlet() , null, null);
                } catch (Exception e) {
                    e.printStackTrace();
                }

        }

        @Override
        public void modifiedService(ServiceReference arg0, Object arg1) {

        }

        @Override
        public void removedService(ServiceReference arg0, Object arg1) {

        }

    });

    httpServiceTracker.open();
}

你能看一下吗。只需将所有必要的捆绑包添加到jboss环境中即可。希望它能成功,但如果不能,请给我一个反馈。实际上,上面的代码在每晚的JBoss7.2.x.alpha上运行得很好。HttpService是在该版本上注入的,因此对我来说,它似乎是7.1.x系列中的一个bug(尝试了7.1.1和7.1.2),理论上它也可能是一个可见性问题。包含HttpService的包是否有多个导出程序?如果是这样,也许你的代码被连接到了“错误的一个”。尝试使用getAllServiceReferences()来查看是否是这种情况。请您仔细检查一下。只需将所有必要的捆绑包添加到jboss环境中即可。希望它能成功,但如果不能,请给我一个反馈。实际上,上面的代码在每晚的JBoss7.2.x.alpha上运行得很好。HttpService是在该版本上注入的,因此对我来说,它似乎是7.1.x系列中的一个bug(尝试了7.1.1和7.1.2),理论上它也可能是一个可见性问题。包含HttpService的包是否有多个导出程序?如果是这样,也许你的代码被连接到了“错误的一个”。尝试改用getAllServiceReferences()来查看情况是否如此。