安全终止 Spring JMS 应用程序

2024-02-15

我正在开发一个 Spring boot JMS 应用程序,该应用程序严格使用 bean 注释进行设置,并从 WebshpereMQ 读取消息。一切正常,除了我不知道如何安全地关闭这个应用程序。一旦我的 JMSListener 方法读取了所有消息,它就会保持空闲状态。我与队列建立初始连接并访问队列深度,因此理想情况下,当队列深度为零时,它需要将其包装并关闭。我当前的解决方法(我根本不喜欢它)是我调用的这个小方法(从侦听器内部,yikes) 当深度为零时:

public void shutDownApplication() {
        logger.info("Initiating shutdown of application...");
        System.out.println("Terminating application...");
        Thread.currentThread().interrupt();
        System.exit(0);
    }

我不喜欢这个解决方案。 Spring 也没有,因为这显然是在进程中作为错误而中断的,在应用程序终止之前,我的 JMSListener 启动回滚并将最后一条剩余消息放回到队列中。

在查看以下来源后,我尝试了一些其他解决方案:

如何停止/启动/暂停@JmsListener(干净的方式) https://stackoverflow.com/questions/32588352/how-can-i-stop-start-pause-a-jmslistener-the-clean-way

如何优雅地关闭 Spring JMS MessageListenerAdapter https://stackoverflow.com/questions/1028025/how-to-gracefully-shut-down-a-spring-jms-messagelisteneradapter

http://forum.spring.io/forum/spring-projects/integration/jms/124980-graceful-shutdown-of-jms-message-listener http://forum.spring.io/forum/spring-projects/integration/jms/124980-graceful-shutdown-of-jms-message-listener

这是我最近的解决方案:

public class JMSShutdownService {

    public void initiateShutdown() {
        JmsListenerEndpointRegistry jmsListenerEndpointRegistry = new JmsListenerEndpointRegistry();
        Collection<MessageListenerContainer> col = jmsListenerEndpointRegistry
                .getListenerContainers();
        for (MessageListenerContainer cont : col) {
            cont.stop(Thread.currentThread());
        }
        System.exit(0);
    }

}

这会终止应用程序,但仍将最后一条消息放回到队列中。我仍在尝试理解 Spring 的许多复杂之处,所以一切都归结为这一点。我觉得主要问题是它在我发出关闭信号的侦听器内部。据我所知,听众不应该为此负责。但我不确定如何定义一种在侦听器启动之前关闭应用程序的方法,或者如何在队列深度为零时从侦听器中弹出。

有任何想法吗?


JmsListenerEndpointRegistry jmsListenerEndpointRegistry = new JmsListenerEndpointRegistry();

那是没有用的;如果您正在使用,新的注册表将不会有任何容器@JmsListener您需要从应用程序上下文中获取注册表。

System.exit(0);

这只会杀死 JVM。

最重要的是,您应该在不同线程上停止容器 - 使用任务执行器启动一个新线程来停止容器;容器将等待线程退出侦听器然后再停止。

停止容器后,您需要等待一段宽限期才能终止 JVM。

你怎么知道你已经完成了?停止容器后可能会显示另一条消息,在这种情况下,您可能会在日志中看到一些关于由于容器正在停止而被拒绝的消息的噪音。

EDIT

在我的听众中...

...
if (timeToShutDown()) {
    Executors.newSingleThreadExecutor.execute(new Runnable() {

        public void run() {
            stopTheContainer();
        }
    }
 }
 // exit the listener so the container can actually stop.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全终止 Spring JMS 应用程序 的相关文章

  • Java Swing BoxLayout 忽略 AlignmentX

    在下面的代码中 通过调用setAlignmentX with Component LEFT ALIGNMENT我希望在居中的滑块上获得左对齐的标签 由于某种原因 标签也居中 似乎与传递给 setAlignmentX 的值无关 我必须向 se
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • Android Toast 消息不起作用

    我正在通过 Andengine 为 Android 开发游戏 我有 MainActivity 类和 GameScene 类 我在 GameActivity 中使用 Toast 消息 它正在发挥作用 Toast makeText this H
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • Spring HATEOAS 和 HAL:更改 _embedded 中的数组名称

    我正在尝试使用 Spring HATEOAS 构建符合 HAL 的 REST API 经过一番摆弄后我终于开始工作了mostly正如预期的那样 示例 输出现在看起来像这样 links self href http localhost 808
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • Time.valueOf 方法返回错误值

    我使用 Time valueOf 方法将字符串 09 00 00 转换为 Time 对象 如下所示 Time valueOf LocalTime parse 09 00 00 当我调用 getTime 来显示我得到的值时 28800000
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi

随机推荐

  • 匹配两张图片之间的颜色主导的最佳策略是什么?

    我需要匹配两张不同图片之间的主色 使它们尽可能相似 例如 我想将下面孩子的灰度图片与士兵的棕褐色图片相匹配 并补偿对比度和闪电 到目前为止 我正在考虑将图片转换为YCrCb 并匹配Y通道直方图上的对比度和其他通道中的颜色 我也必须在彩色图片
  • 如何使用 setuptools/distutils 包含包数据?

    使用 setuptools 时 我无法让安装程序拉入任何内容package data https pythonhosted org setuptools setuptools html including data files文件 我读过的
  • 我应该检查 WebClient.UploadFile 的响应来了解上传是否成功吗?

    我以前从未使用过WebClient 我不确定是否应该检查服务器的响应以了解上传是否成功 或者如果没有异常我是否可以让文件上传 如果我应该检查回复 我该怎么做 解析 resposeHeaders 属性 提前致谢 The UploadFile方
  • 如何获得C语言中经过的时间(以毫秒为单位)? (视窗)

    我在网上搜索过 但只找到了一种方法 但通过这种方式 它会在几秒而不是毫秒内返回 我的代码是 include
  • 如何检测我的进程是否正在运行 UAC 提升的进程?

    我的 Vista 应用程序需要知道用户是否以 管理员 身份 提升权限 或标准用户 非提升权限 启动它 我如何在运行时检测到这一点 对于我们这些使用 C 工作的人来说 在 Windows SDK 中 有一个 UACDemo 应用程序作为 跨技
  • 自定义条形图不同的工具提示

    我现在尝试通过 Chart js 绘制条形图 结果为 图1 and 图2 我知道它可以使用tooltipTemplate Files 自定义工具提示 但是可以在不同的栏中显示不同的文本吗 例如 显示12 10 13 20而不是工具提示12
  • 如何将非托管应用程序窗口置于前面,并使其成为(模拟)用户输入的活动窗口

    我假设我需要使用 pinvoke 但我不确定需要哪些函数调用 场景 一个遗留应用程序将运行 我将拥有该应用程序的句柄 我需要 将该应用程序置于顶部 在所有其他窗口的前面 使其成为活动窗口 需要调用哪些 Windows 函数 如果您没有窗口句
  • 使用 MySQL 检索按小时分组的行

    我有一个包含访问日志的表 我想知道一天 24 小时内每小时发生了多少次对 resource id 123 的访问 我检索此信息的第一个想法就是每小时循环一次 并在每个循环中查询表 例如 and time like hour 鉴于time字段
  • Android:按文件名播放/res/raw中的音频文件

    在我的应用程序的 res raw 文件夹中 我有 file1 ogg file2 ogg fileN ogg 在本地数据库中 我有对文件名的引用 即file1 file2 fileN 给定这些字符串之一 说fileM 我怎样才能播放其中包含
  • 在 html_table(rvest) 中指定列类

    我正在使用 rvest 中的 html table 从下面的网站读取两列索引表 两列都包含我想要保留的前导零的实例 因此 我希望这些专栏具有阶级特征 我使用以下代码 library rvest library data table df l
  • C# 和 C++ 之间的进程间通信

    我正在为游戏编写一个机器人 它具有 C API 接口 即 当事件发生时 游戏会调用 Cpp dll 中的方法 该 dll 可以回调游戏中的方法来触发操作 我真的不想用 C 编写我的机器人 我是一个相当有经验的 C 程序员 但我根本没有 C
  • 编码时需要考虑哪些安全问题?

    我知道 SQL 注入是其中之一 其他是什么 OWASP org 保留了一个列表 从OWASP 前十名 http www owasp org index php Category OWASP Top Ten Project
  • PHP 分页与 MySQLi

    我正在构建自己的 CMS 我制作了一个管理系统 我可以用它在数据库中插入帖子 显示帖子不是问题 但我不知道如何进行分页 这是我的查询 SELECT FROM posts WHERE status draft 构建您的查询以获得LIMIT 结
  • 如何使用 xsom\dom\jaxb 获取 xsd 的最大深度?

    如何使用 xsom 获取 xsd 的最大深度 例如 xsd 的每个复杂类型下的元素总数 另外 如果该复杂类型下存在复杂类型 则该复杂类型下的元素 属性的数量 使用 dom xsom jaxb
  • 对c中的int数组进行排序并删除重复项

    我正在学习C 并且谈到了排序的主题 我写了一个comp 功能和使用qsort对数组进行排序int 现在 对于下一个任务 我需要从数组中删除重复项 是否可以同时排序和删除重复项 include
  • 如何使用 Selenium 和 Python 通过爬虫测试非标准下拉列表

    我正在参与一个大学项目 构建一个网页爬虫 现在我遇到了在网页中测试下拉列表的情况 具体来说 以下页面不使用标准的 下拉 类 https www mirrorfiction com zh Hant book 406 我很难实施决策程序来判断网
  • R-闪亮| cat(list(...)、file、sep、fill、labels、append) 中的错误:参数 1(类型“list”)无法由“cat”处理

    我正在尝试编写一个闪亮的应用程序 并且需要先操作我的数据 然后才能开始可视化它 我有三个输入来操纵数据 1 渠道 2 排除某个词 3 查找所有含有该词的评论 我能够完成前两个任务 但是当使用 grep 函数查找包含某个单词的所有行时 我遇到
  • 如何通过NotificationListener利用Android Nougat的直接回复功能?

    我的应用程序正在使用NotificationListener读取来自各种 3rd 方应用程序的消息 例如 WhatsApp 到目前为止 如果只有一个聊天未读 我就能够发送回复 代码如下 然而 就 WhatsApp 而言 getNotific
  • ASP.NET MVC 多线程,值得吗?

    我有点困惑 我的 ASP NET MVC 应用程序将托管在服务器上 那么使其成为多线程有什么意义吗 例如 如果我想要一个线程来执行我的翻译 这是一个好主意吗 有人可以向我详细说明一下吗 我对网络应用程序多线程与桌面应用程序多线程有点困惑 这
  • 安全终止 Spring JMS 应用程序

    我正在开发一个 Spring boot JMS 应用程序 该应用程序严格使用 bean 注释进行设置 并从 WebshpereMQ 读取消息 一切正常 除了我不知道如何安全地关闭这个应用程序 一旦我的 JMSListener 方法读取了所有