立即发送JMS消息,忽略当前的TX状态

总之,我使用超级简单的JMS配置从春季入门指南: https : //spring.io/guides/gs/messaging-jms/ 。

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

@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成功的情况下才会传递结果,否则逻辑部分失败 – 信息丢失。 我试图以许多不同的方式配置AMQ,也尝试了几个TX变种,但没有为我工作。

我感兴趣的1 /交货不管tx状态2 /立即交付(不推迟,直到目前的TX完成)。

建议?

UPDATE

昨天我试了这个,按预期工作。

  @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()的混乱和exception处理。

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

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

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

Interesting Posts