立即发送JMS消息,不考虑当前发送状态
简而言之,我使用的超级简单JMS配置取自spring入门指南: 我的情况是,即使发送失败,我也希望从事务方法发送JMS消息,类似(kotlin代码): 仅当发送成功时,才会发送结果,否则-更多逻辑部分失败-消息丢失。 我试图用多种不同的方式配置AMQ,也尝试了几种TX变体,但都不适合我 我对……感兴趣 1/不考虑发送状态的交付 2/立即交付(不推迟至当前发送完成) 建议 更新 昨天我试过这个,效果如预期立即发送JMS消息,不考虑当前发送状态,jms,activemq,spring-transactions,spring-jms,Jms,Activemq,Spring Transactions,Spring Jms,简而言之,我使用的超级简单JMS配置取自spring入门指南: 我的情况是,即使发送失败,我也希望从事务方法发送JMS消息,类似(kotlin代码): 仅当发送成功时,才会发送结果,否则-更多逻辑部分失败-消息丢失。 我试图用多种不同的方式配置AMQ,也尝试了几种TX变体,但都不适合我 我对……感兴趣 1/不考虑发送状态的交付 2/立即交付(不推迟至当前发送完成) 建议 更新 昨天我试过这个,效果如预期 @Transactional(propagation = NOT_SUPPORTED)
@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()—如混乱和异常处理。您需要使用两个连接工厂,以便
JmsTemplate
不参与侦听器容器的事务
该模板查找连接工厂上键入的事务性资源(会话)
如果它有不同的连接工厂,它将找不到它,而是使用自己的会话
@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)
}