【问题标题】:Sending JMS message immediately disregarding current TX status立即发送 JMS 消息而不考虑当前的 TX 状态
【发布时间】:2023-03-30 11:10:01
【问题描述】:

简而言之,我使用来自 springGetting Started 指南的超级简单 JMS 配置:https://spring.io/guides/gs/messaging-jms/

我的情况是,即使 TX 失败,我也想从事务方法发送 JMS 消息,例如(kotlin 代码):

@Service
open class MyService(private val t: JmsTemplate) {
//
  @Transactional
  open fun go(sth: String) {
    val result = // some logic here
    t.convertAndSend("NeedsToBeDelivered", result)
    // more logic which might fail
  }
}

只有在 TX 成功时才会传递结果,否则 - 更多逻辑部分失败 - msg 丢失。 我试图以多种不同的方式配置 AMQ,也尝试了几种 TX 变体,但没有一个适合我。

我感兴趣 1/ 交付无视 tx 状态 2/ 立即交付(不推迟到当前的 TX 完成)。

建议?

更新

昨天我尝试了这个并且按预期工作。

 @Transactional(propagation = NOT_SUPPORTED)
 fun sendNoTx(msg: String, destination: String) = try {
    val con = cf.createConnection() // cf stands for connection factory
    con.start()
    val session = con.createSession(false, AUTO_ACKNOWLEDGE)
    val producer = session.createProducer(session.createQueue(destination))
    producer.send(session.createTextMessage(msg))
    con.close()
 } catch (e: Exception) {
    LOG.warn("Failed to send NO TX message", e)
 }

Gary 建议的更优雅的解决方案是为 JmsTemplate 提供另一个 CF 实例 - 这样做可以避免所有 conn.close() 之类的混乱和异常处理。

【问题讨论】:

    标签: jms activemq spring-transactions spring-jms


    【解决方案1】:

    您需要使用 2 个连接工厂,以便 JmsTemplate 不参与侦听器容器的事务。

    模板会查找连接工厂的事务资源(会话)。

    如果它有不同的连接工厂,它将找不到它,而是使用自己的会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2021-03-27
      相关资源
      最近更新 更多