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。
我将 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。