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 を正常に停止するにはどうすればよいですか?