1

JBoss 7.1.2アプリケーションサーバーを稼働させており、サーブレットを登録するOSGiバンドルをデプロイしたいと思いました。(Hello Worldの一種ですが、サーブレット経由)

おそらくこれを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();
        }
    }

バンドルをデプロイして開始した後、httpServiceReferenceはnullです。これは奇妙だと思います。なぜなら、felix Webコンソールを見ると、実際にHtttpServiceが利用できるからです。(pax-webから)

ここで私の参照がnullになる理由を誰かが知っていますか?ありがとう!

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 に答える