java - 在 Eclipse RCP 中以编程方式关闭嵌入式 Jetty 服务器

标签 java eclipse jetty

我已成功将 Jetty 嵌入到我的 Eclipse RCP 应用程序中。 在我的 RCP 应用程序中,当用户单击某个按钮时,将打开一个浏览器并显示一些 servlet 页面。 jsp 文件位于一个单独的目录中,它是一个 angulajs Web 应用程序。

当用户关闭 RCP 时,我试图从 Eclipse UI 插件关闭嵌入式 Jetty 服务器。该服务器是在名为 Workshop 的类中启动的,该类是 Web 项目的一部分,因此我无权访问服务器实例来调用 Eclipse UI 插件中的 server.stop()。我已经尝试了下面的代码,但本质上是这样。 1>将ShutdownHook配置到Web项目的Workshop

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 响应代码。因此 Jetty 服务器仍在运行。我们如何处理 Eclipse UI 插件中的嵌入式 Jetty 关闭。

我确实阅读了很多文章,但找不到我的问题的答案。

任何帮助将不胜感激。谢谢。

最佳答案

问题:每次调用 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)向Eclipse UI类添加shutdownhook

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());
                }
            }
        });

这解决了我的问题,希望对其他人有帮助。

关于java - 在 Eclipse RCP 中以编程方式关闭嵌入式 Jetty 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36139976/

相关文章:

使用 JAXB 基于条件的 Java spring XML 绑定(bind)

java - eclipse 的鱼眼

java - 如何在本地主机上启动 cxf 服务但在 wsdl 中返回外部地址?

java - 为什么我的 android Activity 偶尔会崩溃并显示 "No adapter attached; skipping layout"?

java - 如何使用 Jackson 数据类型 : JSR310 Deser standalone?

java - 在 eclipse 之外找不到工作区

java - 如何在mongo中插入带有日期的文档?

java - 接收类型 java.lang.CharSequence 无法解析。 Java 8 JDK 的错误消息

clojure - 如何以编程方式在 Jetty 中设置 gzip?

java - 只允许某些类访问私有(private)变量的接口(interface)