在 Eclipse RCP 中以编程方式关闭嵌入式 Jetty 服务器
Shutdown Embedded Jetty Server programmatically in Eclipse RCP
我已成功将 Jetty 嵌入到我的 Eclipse RCP 应用程序中。
在我的 RCP 应用程序中,当用户单击某个按钮时,将打开浏览器并显示一些 servlet 页面。 jsp 文件在一个单独的目录中,它是一个 angulajs 网络应用程序。
我试图在用户关闭时从 Eclipse UI 插件关闭嵌入式 Jetty 服务器 RCP.The 服务器在名为 Workshop
的 class 中启动,它是web 项目,所以我无法访问要调用的服务器实例,来自 Eclipse UI Plugin.I 的 server.stop() 已经尝试了下面的代码,但在静脉中。
1>配置ShutdownHook到web项目
的Workshop
class
server = new Server();
server.setConnectors(new Connector[] { connector });
server.setHandler(handlers);
server.start();
handlers.addHandler(new ShutdownHandler(server, "abc"));
server.setStopAtShutdown(true);
server.setGracefulShutdown(7_000);
ShutdownThread.getInstance().run();
2> 在我的 Eclipse UI 插件中,我添加了
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
URL url = new URL("http://localhost:" + resultPortNo + "/shutdown?token=" + shutdownCookie);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.getResponseCode();
logger.info("Shutting down " + url + ": " + connection.getResponseMessage());
} catch (SocketException e) {
// logger.debug("Not running");
// Okay - the server is not running
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
HtppUrlConnection 抛出 404-NotFound 响应 code.So Jetty 服务器仍然 运行。我们如何处理来自 Eclipse UI 插件的嵌入式 Jetty 关闭。
我确实阅读了很多文章,但找不到我的问题的答案。
任何帮助都将是 appreciated.Thank 你。
问题:每次调用 jettyServer.stop 时,都会抛出中断异常,jetty 服务器继续 运行。
解决方案:(1) 在 Servlet 代码中添加带有守护线程的 Executor Service 以停止 Jetty 服务器
JettyShutdownServlet.js
-----------------------
ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
pool.execute(new Runnable() {
@Override
public void run() {
if (null != jettyServer) {
try {
jettyServer.stop();
jettyServer.join();
} catch (Exception e) {
logger.info("Error when stopping Jetty: " + e.getMessage());
}
}
}
});
(2) 在 Jetty 启动代码中添加 servlet。
servletContextHandler.addServlet(new ServletHolder(new JettyShutdownServlet(server)), "/shutdown");
(3) 将 shutdownhook 添加到 Eclipse UI class
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
String shutdownurl = "http://localhost:" + resultPortNo + "/api/shutdown";
URL url = new URL(shutdownurl);
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
try {
connection.getResponseCode();
connection.disconnect();
} catch (SocketException e) {
// logger.debug("Not running");
// Okay - the server is not running
connection.disconnect();
}
} catch (Exception x) {
// exception during shutdown
Activator.error("Unable to shutdown Jetty Server.\n" + x.getMessage());
}
}
});
这解决了我的问题,希望对其他人有所帮助。
我已成功将 Jetty 嵌入到我的 Eclipse RCP 应用程序中。 在我的 RCP 应用程序中,当用户单击某个按钮时,将打开浏览器并显示一些 servlet 页面。 jsp 文件在一个单独的目录中,它是一个 angulajs 网络应用程序。
我试图在用户关闭时从 Eclipse UI 插件关闭嵌入式 Jetty 服务器 RCP.The 服务器在名为 Workshop
的 class 中启动,它是web 项目,所以我无法访问要调用的服务器实例,来自 Eclipse UI Plugin.I 的 server.stop() 已经尝试了下面的代码,但在静脉中。
1>配置ShutdownHook到web项目
Workshop
class
server = new Server();
server.setConnectors(new Connector[] { connector });
server.setHandler(handlers);
server.start();
handlers.addHandler(new ShutdownHandler(server, "abc"));
server.setStopAtShutdown(true);
server.setGracefulShutdown(7_000);
ShutdownThread.getInstance().run();
2> 在我的 Eclipse UI 插件中,我添加了
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
URL url = new URL("http://localhost:" + resultPortNo + "/shutdown?token=" + shutdownCookie);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.getResponseCode();
logger.info("Shutting down " + url + ": " + connection.getResponseMessage());
} catch (SocketException e) {
// logger.debug("Not running");
// Okay - the server is not running
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
HtppUrlConnection 抛出 404-NotFound 响应 code.So Jetty 服务器仍然 运行。我们如何处理来自 Eclipse UI 插件的嵌入式 Jetty 关闭。
我确实阅读了很多文章,但找不到我的问题的答案。
任何帮助都将是 appreciated.Thank 你。
问题:每次调用 jettyServer.stop 时,都会抛出中断异常,jetty 服务器继续 运行。
解决方案:(1) 在 Servlet 代码中添加带有守护线程的 Executor Service 以停止 Jetty 服务器
JettyShutdownServlet.js
-----------------------
ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
pool.execute(new Runnable() {
@Override
public void run() {
if (null != jettyServer) {
try {
jettyServer.stop();
jettyServer.join();
} catch (Exception e) {
logger.info("Error when stopping Jetty: " + e.getMessage());
}
}
}
});
(2) 在 Jetty 启动代码中添加 servlet。
servletContextHandler.addServlet(new ServletHolder(new JettyShutdownServlet(server)), "/shutdown");
(3) 将 shutdownhook 添加到 Eclipse UI class
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
String shutdownurl = "http://localhost:" + resultPortNo + "/api/shutdown";
URL url = new URL(shutdownurl);
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
try {
connection.getResponseCode();
connection.disconnect();
} catch (SocketException e) {
// logger.debug("Not running");
// Okay - the server is not running
connection.disconnect();
}
} catch (Exception x) {
// exception during shutdown
Activator.error("Unable to shutdown Jetty Server.\n" + x.getMessage());
}
}
});
这解决了我的问题,希望对其他人有所帮助。