Jetty:以编程方式停止会导致“1 个线程无法停止”

2023-11-27

我有一个嵌入式 Jetty 6.1.26 实例。 我想通过 HTTP GET 发送到来关闭它/shutdown。 所以我创建了一个JettyShutdownServlet:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 resp.setStatus(202, "Shutting down.");
 resp.setContentType("text/plain");
 ServletOutputStream os = resp.getOutputStream();
 os.println("Shutting down.");
 os.close();
 resp.flushBuffer();

 // Stop the server.
 try {
    log.info("Shutting down the server...");
    server.stop();
 } catch (Exception ex) {
    log.error("Error when stopping Jetty server: "+ex.getMessage(), ex);
 }

但是,当我发送请求时,Jetty 不会停止 - 线程一直挂在org.mortbay.thread.QueuedThreadPoolthis.wait():

   // We are idle
   // wait for a dispatched job
   synchronized (this)
   {
       if (_job==null)
          this.wait(getMaxIdleTimeMs());
       job=_job;
       _job=null;
   }

...

2011-01-10 20:14:20,375 INFO  org.mortbay.log jetty-6.1.26
2011-01-10 20:14:34,756 INFO  org.mortbay.log Started [email protected]:17283
2011-01-10 20:25:40,006 INFO  org.jboss.qa.mavenhoe.MavenHoeApp Shutting down the server...
2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown [email protected]:17283
2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown org.mortbay.jetty.servlet.Context@1672bbb{/,null}
2011-01-10 20:25:40,006 INFO  org.mortbay.log Graceful shutdown org.mortbay.jetty.webapp.WebAppContext@18d30fb{/jsp,file:/home/ondra/work/Mavenhoe/trunk/target/classes/org/jboss/qa/mavenhoe/web/jsp}
2011-01-10 20:25:43,007 INFO  org.mortbay.log Stopped [email protected]:17283
2011-01-10 20:25:43,009 WARN  org.mortbay.log 1 threads could not be stopped
2011-01-10 20:26:43,010 INFO  org.mortbay.log Shutdown hook executing
2011-01-10 20:26:43,011 INFO  org.mortbay.log Shutdown hook complete

它会阻塞整整一分钟,然后关闭。 我添加了 Graceful shutdown,它应该允许我从 servlet 关闭服务器;但是,正如您从日志中看到的那样,它不起作用。

我是这样解决的:

Server server = new Server( PORT );
server.setGracefulShutdown( 3000 );
server.setStopAtShutdown(true);
...
server.start();

if( server.getThreadPool() instanceof QueuedThreadPool ){
   ((QueuedThreadPool) server.getThreadPool()).setMaxIdleTimeMs( 2000 );
}

setMaxIdleTimeMs()需要在之后调用start(),因为线程池是在start()。但是,线程已经创建并正在等待,因此仅在所有线程至少使用一次后才适用。

除了中断所有线程等一些可怕的事情之外,我不知道还能做什么System.exit().

有任何想法吗?有什么好的办法吗?


Graceful 不会做你想象的那样 - 它允许服务器优雅地关闭,但它does not允许您从 servlet 内部关闭。

问题如您链接到的邮件列表帖子中所述 - 您正在尝试停止服务器,同时仍在服务器内部处理连接。

您应该尝试将 servlet 的实现更改为:

// Stop the server.
new Thread()
{
   public void run() {
     try {
        log.info("Shutting down the server...");
        server.stop();
        log.info("Server has stopped.");
     } catch (Exception ex) {
        log.error("Error when stopping Jetty server: "+ex.getMessage(), ex);
     }
   }
}.start();

这样,servlet 就可以在服务器关闭时完成处理,并且不会阻碍关闭过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetty:以编程方式停止会导致“1 个线程无法停止” 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 找不到类“App\Providers\AppServiceProvider”

    我已经使用命令更改了我的应用程序 php artisan app name app name 然后 当我尝试使用以下 artisan 命令执行其他操作时 php artisan down php artisan up php artisan
  • 如何将 Python 站点包文件夹(未包含在内)添加到 PyInstaller 规范文件中?

    我在使用 PyInstaller 时遇到了包含 python 包的问题 特别是docxcompose 这是一个需要在 PyInstaller 目录中导入其 site package 文件夹的包 我已经用 pip 安装了 docxcompos
  • iPhone 打开 DATA:Safari 中的 URL

    我有一个数据 URL 请参阅 http en wikipedia org wiki Data URI scheme 作为 NSString 我想在 Safari 中打开它 你将如何完成这个 我尝试过 openURL 例子 data text
  • 哪些浏览器支持多行字符串?

    哪些浏览器支持多行字符串 foo bar 和往常一样 我主要怀疑 IE 不支持它 哪个 IE 版本最先支持它 所有当前版本的主要浏览器都接受多行字符串 注意 该技术显然不存在于 符合浏览器标准 然而 当 在主要浏览器的所有当前版本上进行了测
  • 我们能否通过接受(或忽略)新功能来使 ML 模型(pickle 文件)更加健壮?

    我训练了一个 ML 模型 并将其存储到 Pickle 文件中 在我的新脚本中 我正在阅读新的 现实世界数据 我想对其进行预测 然而 我正在挣扎 我有一列 包含字符串值 例如 Sex Male Female This is just as e
  • 仅 CSS 工具提示,带有箭头和边框

    Styles Tooltip position absolute z index 999 width 200px height 57px padding 20px font family Comic Sans MS cursive font
  • ThreadPoolExecutor 中的死锁

    遇到一个情况时ThreadPoolExecutor停在execute Runnable 功能同时所有ThreadPool线程正在等待getTaskfunc workQueue 为空 有人有什么想法吗 The ThreadPoolExecut
  • angularjs 支持哪些版本的 Firefox?

    In the AngularJS 文档 他们说 Angular 支持 Webkit Firefox IE gt 8 但 Firefox 到底是哪些版本呢 我需要创建一个支持 Firefox 25 的应用程序 那可能吗 我知道这是一个旧线程
  • 如何在Vim中高效地交错多组线条?

    我正在尝试交错三组文本行 例如 以下文本 a a a b b b c c c 将被转化为 a b c a b c a b c 有没有有效的方法来做到这一点 在我内心深处的某个地方 vim文件我有一个 Interleave命令 附在下面 不带
  • 使用空格分隔符和最大长度分割字符串

    我想以类似的方式分割字符串 split 因此产生一个列表 但以更智能的方式 我希望它将其分割成最多 15 个字符的块 但不会分割中间的单词 因此 string A string with words splitting process ta
  • 如何在 BQ 命令行中设置 Bigquery 需要分区过滤器

    在 Big Query Web GUI 中创建新的空分区表架构时 您可以设置需要分区过滤器选项 使用 bq 命令行工具创建表时如何设置相同的选项 现在我的命令是 bq mk table time partitioning field eve
  • Bash 终端输出 - 突出显示包含某些文本的行

    当我在 bash 中得到输出时 我得到了标准的 2 色屏幕 默认情况下 如果某行包含一些关键文本输出 有什么方法可以突出显示该行吗 例如 如果它包含单词 FAIL 则该行颜色为红色 我读过这个https unix stackexchange
  • 如何索引 PDF 文件并搜索关键字?

    我有一堆 PDF 几百个 它们没有适当的结构 也没有特定的领域 他们所拥有的只是大量的文字 我正在尝试做的事情 对 PDF 建立索引并根据索引搜索一些关键字 我有兴趣查找该特定关键字是否在 PDF 文档中 如果是 我想要找到该关键字的行 如
  • 用 UI 对话框替换提示

    如何用简单的 UI 对话框替换此代码中的提示以实现相同的效果 使用提示时 IE 会发出安全警告 HTML
  • vh / % 单位和移动设备上的键盘

    我对像这样的单位有问题vh 对于高度 当有任何input处于活动状态时 移动设备上的键盘会更改元素高度 我正在寻找在键盘处于活动状态时将其更改为静态高度的解决方案 jsfiddle 在移动设备上打开 这个问题很简单 我们以前都经历过 幸运的
  • iPad 上捕获视图上下文的质量低

    我需要捕获特定的 UIView 但结果质量低下 如何解决此问题并提高质量 UIGraphicsBeginImageContext captureView bounds size captureView layer renderInConte
  • 在 C# 中使用 WMI 更改用户家长控制设置

    我对 WMI 和 COM 真的很陌生 我想更改用户帐户家长控制的一些参数和 唯一可用的 API 是 WMI 要使用的 WMI 提供程序类是 WpcUserSettings 我不明白如何修改每个用户的参数 我必须创建一个 每个用户都有此类的
  • 如何防止 WordPress 剥离摘录中的 HTML 标签

    我正在使用 wp trim words 修剪主页上的一些摘录 它工作正常 只是它从摘录中删除了 HTML 标签 我需要能够将摘录的某些部分加粗 使用 strong 按照说明进行操作here 我尝试删除 wp trim words 函数并使用
  • Laravel - 作业在一台服务器上调度,在另一台服务器上处理

    我正在研究 Laravel 应用程序的日志记录方面 amd 计划将数据发送到 SQS 以便稍后检索 但是 我想将作业从生产服务器分派到 AWS 队列 然后让队列在侦听队列的单独日志服务器上工作 我了解如何设置队列工作程序来监听队列 但是 L
  • Jetty:以编程方式停止会导致“1 个线程无法停止”

    我有一个嵌入式 Jetty 6 1 26 实例 我想通过 HTTP GET 发送到来关闭它 shutdown 所以我创建了一个JettyShutdownServlet Override protected void doGet HttpSe