согласно http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fua_help_war.htm Я установил выделенный сервер Tomcat, на котором запущено несколько eclipse-help- плагины.
Сервер, а также помощь работают хорошо. Но теперь я понял, что остановка сервера, особенно OSGi-Framework, кажется проблемой. Мне всегда приходится убивать серверный процесс, если развернута война справки, и я считаю, что должен изящно завершить работу OSGi-Framework.
После некоторого исследования я придумал следующую реализацию ServletContextListener, которая останавливает системный пакет, вызывая bundleContext.getBundle(0).stop():
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 для остановки фреймворка.
EDIT: я изменил код на sce.getServletContext().getAttribute("osgi-bundlecontext") в contextDestroyed() и contextInitialized(), но в обоих случаях я не получаю ссылку на пакет контекст. Контекст пакета всегда нулевой.
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 при выключении сервера?