1

我有一个 JBoss 7.1.2 应用程序服务器启动并运行,现在我想在其中部署一个注册 servlet 的 OSGi 包。(类似于 Hello World,但通过 servlet)

可能可以通过 WAB 将其存档,但与在 OSGi 中一样,我认为它也应该在一个简单的非 wab 包中工作。

我使用 Activator 创建了一个捆绑包,如下所示:

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();
        }
    }

部署并启动捆绑包后,httpServiceReference 为null. 我觉得这很奇怪,因为当我查看 felix Web 控制台时,实际上HtttpService 可用。(来自 pax-web)

有谁知道为什么我的参考在这里可能是空的?谢谢!

4

1 回答 1

1

我认为您正在犯经典的 OSGi 错误。在该start(BundleContext context)方法中,您将获得对 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();
}
于 2013-05-06T02:32:16.817 回答