【发布时间】: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