当前位置: 首页 > 知识库问答 >
问题:

如何在提交时使用JTA确认JMS消息?

须鸿祯
2023-03-14

我正在与JTA、两阶段提交、JMS和JDBC事务作斗争。这个想法(简而言之)是

  1. 在队列中接收消息

所以我得到了XAQueueConnectionFactory,创建XAQueueSession,从会话创建接收器并设置消息侦听器。

在侦听器内部,在onMessage方法中,我开始我的用户事务,执行jdbc内容并提交事务或在出现问题时进行回滚。现在我期望(又名“希望”)当用户事务提交时,消息会得到确认。

但这并没有发生,消息仍然在队列中,并且一次又一次地被重新传递。

我错过了什么?我仔细检查了会话,确认模式确实是“SESSION_TRANSACTED”,并且getTransact返回true。

我没有Java EE容器,没有spring,没有消息驱动bean。我使用独立的JTA bitronix。

共有3个答案

荆城
2023-03-14

我认为对于XA,您不应该使用事务会话。

时才俊
2023-03-14

当您说在侦听器内部,您开始了您的用户事务时,这似乎暗示您正在使用Bean托管事务(BMT)。这样做有充分的理由吗?

如果您使用容器管理事务(CMT),那么您想要的将是免费的。

据我所知,BMT是不可能的,因为UserTransaction不会参与,也无法参与为消息创建的事务。但是您可能需要仔细检查JavaEE规范。

编辑:抱歉,我意识到你没有使用Java EE容器太晚了。

是否确定在侦听器中启动的用户事务是为消息启动的事务的一部分?似乎您为db工作启动了一个独立事务

如果您不使用容器,谁提供JMS实现,即XAQueueConnectionFactory等?

毕和志
2023-03-14

您不需要XA来完成此操作。只需遵循您的算法:接收消息,执行DB操作,然后确认消息。。。实际上,这就是解决方案。(您可能只需要选择显式CLIENT\u ACKNOWLEDGE,而不是事务会话。)如果您的应用程序在执行DB操作时失败,请不要确认JMS消息,它将被重新交付。如果您的应用程序在DB txn之后和ack之前失败,则消息将被重新传递——但您可以检测到这一点(消息上的重新传递标志将设置为true),并且您可以根据数据库的状态决定是否重新处理消息。

 类似资料:
  • 我正在使用ReplyingKafkaTemplate.sendAndReception()发送和接收由相关ID关联的消息。用例有许多主题正在进行中,我需要手动acknoledge(提交)消耗的消息偏移量。到目前为止还不错,这是使用: 但我不知道如何手动确认最后一条消息(sendAndReceive()使用的消息)。 有什么提示吗? 谢谢 费尔南多

  • 我曾尝试用谷歌搜索这个,但没有成功。如果我使用的是,并且我有一个用Java编写的客户机,那么消息何时被确认?我正在使用一个,它包含一个方法。确认信息是在完成之前还是在完成之后或在其他时间点发送回服务器?提前感谢任何人提供的任何帮助!

  • 问题内容: 我试图用谷歌搜索,但是没有成功。如果我正在使用,并且我有一个用Java编写的使用者客户端,则何时确认消息?我正在使用一个包含方法的。确认是在完成之前或之后还是在其他时间发送回服务器?在此先感谢任何人都可以提供的任何帮助! 问题答案: 请检查这一个。 在模式下,确认始终是处理程序返回后隐式发生的最后一件事。通过在使用会话上指定模式,接收消息的客户端可以对保证消息的传递进行更细粒度的控制。

  • 我在Weblogic 12c上部署了一个MDB,它从JMS队列(UDQ)读取消息。MDB正在读取消息,但它没有从JMS队列中删除,这导致消息被重复读取。所以,我想知道MDB何时确认JMS队列它成功读取了消息,并且队列应该删除该消息。

  • 我有一个非常基本的JTA问题。 我们使用Spring的AOP将WebLogicJtaTransactionManager切入点应用于服务类中的任何方法......并且我们设置tx: method timeout="60"。 有趣的是在该服务中,我们运行一个select语句从数据库中检索记录(使用Hibernate/JPA),然后去做一些与数据库/事务无关的工作。该方法运行时间超过60秒,并且永远不

  • 问题内容: 对于带有警报的简单表单,询问是否正确填写了字段,我需要执行以下操作的函数: 单击带有两个选项的按钮时显示警报框: 如果单击“确定”,则提交表单 如果单击“取消”,则警告框关闭,可以调整并重新提交表单 我认为JavaScript确认会起作用,但我似乎无法弄清楚该怎么做。 我现在拥有的代码是: 问题答案: 一个简单的 内联JavaScript确认 就足够了: 除非您正在执行 验证 ,否则不