gpt4 book ai didi

jms - 消费者端的 CLIENT_ACKNOWLEDGE 与 Session.commit() - JMS

转载 作者:行者123 更新时间:2023-12-04 00:45:19 24 4
gpt4 key购买 nike

我读了这个问题(Multithreaded JMS code : CLIENT_ACKNOWLEDGE or transacted session),但我不明白这两种方法在消息消费者中有什么区别:

  1. 连接未被处理。 session 处于 CLIENT_ACKNOWLEDGE 模式。我们收到多条消息,然后是一条 acknowledge()
  2. 连接已处理(不是xa)。 session 处于 AUTO_ACKNOWLEDGE 模式。我们收到多条消息,然后执行 commit()

这取决于消息提供者的行为吗?

最佳答案

如果 session 被处理,acknowledgeMode 被忽略。这就是为什么在 JMS 2.0 中添加了一个新的单参数 createSession(int) 以使其更加直观。所以没有“自动确认模式下的事务处理 session ”这样的东西。您有一个交易 或一个自动确认 session 。事务处理 session 中对 Message.acknowledge() 的调用将被忽略(JMS API 为 specified)。

那么有什么区别呢?这与您使用的是一个还是多个目的地无关,因为互联网上声称有多个地方(包括此处的其他答案)。这取决于 session 是仅消费还是消费生产。如果它是仅消费的(您不产生任何消息),那么两种模式是相同的:调用 Message.acknowledge()Session.commit() 确认所有在 session 中收到的消息。即使从多个队列接收。

消费-生产 session 的行为:

  • client-acknowledge:发送的消息在 MessageProducer.send() 方法返回后立即提交。当调用 Message.acknowledge() 时,客户端消息会立即全部确认。这在规范中没有具体提及,但我认为如果代理在确认一半消息后失败,客户端将报告错误并且只有一部分消息将保持确认状态。这为您提供了至少一次的保证:如果您在流程结束时确认并且您的程序在中途失败,则输出消息将生成两次。

  • 事务性:已发送的消息以原子方式提交,同时确认 session 中收到的所有消息。客户端或代理端的故障不会导致仅生成或确认消息的一部分。这为您提供了恰好一次的处理保证。它甚至更快:据称herehere ,如果您在一个事务中生成多条消息,MessageProducer.send() 方法将是异步的,commit() 方法将等待所有发送完成一批.

关于jms - 消费者端的 CLIENT_ACKNOWLEDGE 与 Session.commit() - JMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com