客户机端-JMS中的CLIENT_ACKNOWLEDGE vs Session.commit()

客户机端-JMS中的CLIENT_ACKNOWLEDGE vs Session.commit(),jms,Jms,我读了这个问题(),但我不明白message consumer中这两种方法的区别是什么: 未处理连接。会话处于客户端确认模式。我们收到多条消息,然后一条acknowledge() 连接是事务性的(不是xa)。会话处于自动确认模式。我们收到多条消息,然后执行commit() 这取决于消息提供程序的行为吗 我认为当只从一个目的地接收消息时,差别不大。可以使用客户端确认或事务处理会话 但是,当在会话中使用多个目的地时,例如从队列接收消息,然后对其进行处理并将处理结果发布到同一会话中的另一个主题时,事务

我读了这个问题(),但我不明白message consumer中这两种方法的区别是什么:

  • 未处理连接。会话处于
    客户端确认
    模式。我们收到多条消息,然后一条
    acknowledge()
  • 连接是事务性的(不是
    xa
    )。会话处于
    自动确认
    模式。我们收到多条消息,然后执行
    commit()

  • 这取决于消息提供程序的行为吗

    我认为当只从一个目的地接收消息时,差别不大。可以使用客户端确认或事务处理会话


    但是,当在会话中使用多个目的地时,例如从队列接收消息,然后对其进行处理并将处理结果发布到同一会话中的另一个主题时,事务性会话更适合。所以,接收和发布消息都将发生在一个事务中。根据消息处理的结果,可以提交或回滚事务。

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

    那么有什么区别呢?这不是你使用一个或多个目的地,就像互联网上的多个地方所宣称的那样(包括这里的另一个答案)。这取决于会话是仅使用还是使用生成。如果是仅使用(您不生成任何消息),则两种模式都是相同的:调用
    Message.acknowledge()
    Session.commit()
    确认会话中接收的所有消息。即使从多个队列接收

    消费-生产会话的行为:

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

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