1

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fua_help_war.htmによると、いくつかの eclipse-help- を実行する専用の Tomcat サーバーをセットアップしました。プラグイン。

サーバーとヘルプも正常に稼働しています。しかし、サーバー、特に OSGi-Framework を停止することが問題のように思われることに気付きました。help-war が展開されている場合は、常にサーバー プロセスを強制終了する必要があり、OSGi フレームワークを適切にシャットダウンする必要があると考えています。

いくつかの調査の後、bundleContext.getBundle(0).stop() を呼び出してシステムバンドルを停止する ServletContextListener の次の実装を思いつきました。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;

public class OsgiShutdownListener implements ServletContextListener {

    /** {@inheritDoc} */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        Bundle bundle = FrameworkUtil.getBundle(org.eclipse.core.runtime.adaptor.EclipseStarter.class);
        BundleContext bundleContext = bundle.getBundleContext();
        try {
            bundleContext.getBundle(0).stop();
        } catch (BundleException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /** {@inheritDoc} */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("starting");

    }
}

しかし、FrameworkUtil.getBundle(org.eclipse.core.runtime.adaptor.EclipseStarter.class) は常に null を返すため、フレームワークを停止するために BundleContext への参照を取得することはありません。

編集: contextDestroyed() と contextInitialized() でコードを sce.getServletContext().getAttribute("osgi-bundlecontext") に変更しましたが、どちらの場合もバンドル コンテキストへの参照がありません。バンドル コンテキストは常に null です。

public class OsgiShutdownListener implements ServletContextListener {

    private BundleContext bundleContext;

    /** {@inheritDoc} */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // Bundle bundle =
        // FrameworkUtil.getBundle(org.eclipse.core.runtime.adaptor.EclipseStarter.class);
        // this.bundleContext = bundle.getBundleContext();

        ServletContext context = sce.getServletContext();
        this.bundleContext = (BundleContext) context
                .getAttribute("osgi-bundlecontext");
        try {
            this.bundleContext.getBundle(0).stop();
        } catch (BundleException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /** {@inheritDoc} */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        this.bundleContext = (BundleContext) context
                .getAttribute("osgi-bundlecontext");
    }
}

この状況で bundleContext を取得してシステム バンドルを停止するにはどうすればよいですか? または、サーバーがシャットダウンしたときに OSGi-Framework を正常に停止するにはどうすればよいですか?

4

2 に答える 2

1

EclipseStarterランチャー アプリケーションの一部であるため、OSGi の「外部」にあり、バンドル ClassLoader によってロードされません。したがって、(最終的に!) FrameworkUtil.getBundle() から null を返します。

システム バンドル コンテキストを取得する必要があります... OSGi を正常に起動したため、過去のある時点でこれを取得したに違いありません。では、フィールドでそれを覚えたり、停止時にまだ表示されるように手配したりしないのはなぜですか?

于 2013-06-27T15:23:22.280 に答える