首页 > 解决方案 > 使用 TIBCO EMS EXPLICIT_CLIENT_DUPS_OK_ACKNOWLEDGE 的 Spring JMS 确认行为

问题描述

我将 Spring JMS 与 TIBCO EMS 队列/主题一起用于我的 Spring Boot 应用程序。TIBCO EMS 队列使用 EXPLICIT_CLIENT_DUPS_OK_ACKNOWLEDGE 设置。在我的代码中,我没有设置确认模式,所以我假设 spring 会将它作为默认的 AUTO_ACKNOWLEDGE。我在侦听器 onMessage 方法中注意到的行为是,如果应用程序成功处理了消息,则不会重新传递相同的消息,如果应用程序抛出 RuntimeException,则会重新传递相同的消息。该代码还使用 DefaultJmsListenerContainerFactory 将 setSessionTransacted 设置为 true。在这种情况下,是 spring 实际代表我确认消息还是代码需要设置 message.acknowledge()。

标签: spring-bootspring-jmstibco-ems

解决方案


请参阅 .java 文档Session。表示提供程序库在返回消息或退出Auto时自动确认消息。consumer.receive()consumer.messsageListener()

使用 a SimpleMessageListenerContainer,您的侦听器由提供者的 Consumer 直接调用,因此在您的侦听器正常退出之前,消息不会被自动确认。

而是调用并在其自己的线程上调用您的侦听DirectMessageListenerContainer器。receive()因此,我们需要事务在抛出异常后回滚 ack。


推荐阅读