Spring TIBCO EMS 的 JMS 确认行为 EXPLICIT_CLIENT_DUPS_OK_ACKNOWLEDGE

Spring JMS acknowledgement behavior with TIBCO EMS EXPLICIT_CLIENT_DUPS_OK_ACKNOWLEDGE

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

请参阅 Session 的 javadoc。 Auto 表示提供程序库在 consumer.receive() returns 或 consumer.messsageListener() 退出时自动确认消息。

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

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