【问题标题】:Stop Spring standalone service停止 Spring 独立服务
【发布时间】:2015-08-13 13:15:35
【问题描述】:

我在我的项目中使用 Spring Integration。

我们有一个要求,如果数据库出现故障,我们将停止 Spring 独立服务。

在消息侦听器中,当我将数据持久保存到数据库中时,我检查是否收到 CannotGetJdbcConnectionException,然后使用 applicationContext.close() 方法停止 Spring 服务。

这里的问题是,如果我在队列中收到任何消息并且数据库出现故障。

我试图关闭 Spring 服务,然后所有资源都关闭了,除了保存该消息的 DefaultMessageListenerContainer。

如果我手动终止进程,则消息进入入站队列,这是正确的。

有什么办法可以强制停止 Spring 服务并将消息放回入站队列?

我希望我在这里清楚我的观点。

谢谢 萨钦

【问题讨论】:

    标签: spring spring-integration spring-jdbc


    【解决方案1】:

    您应该使用setSessionTransacted(true)acknowledge="transacted" 使用命名空间定义端点时)配置 DMLC。

    然后所有正在进行的消息将回滚到队列中。

    【讨论】:

    • 我已经设置了确认="transacted"。。如何在 DB 关闭时关闭保存消息的活动会话?
    • context关闭时容器会停止;如果没有,很可能您有一些应用程序代码阻止线程终止。使用 jstack 或类似方法进行线程转储以找出答案。
    • 当前持有邮件的 DMLC 并未终止,因为邮件仍在传输中,并且尚未移动到入站或错误代码。所以该线程不会被终止。是否可以手动将消息移动到错误代码,就像我们可以停止入站适配器然后关闭 applicationContext
    • 关闭上下文将停止线程,除非您的代码阻止它。正如我所说,您需要查看线程转储以了解它为什么没有终止。
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 2015-08-18
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多