Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
立即发送JMS消息,不考虑当前发送状态_Jms_Activemq_Spring Transactions_Spring Jms - Fatal编程技术网

立即发送JMS消息,不考虑当前发送状态

立即发送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)

简而言之,我使用的超级简单JMS配置取自spring入门指南:

我的情况是,即使发送失败,我也希望从事务方法发送JMS消息,类似(kotlin代码):

仅当发送成功时,才会发送结果,否则-更多逻辑部分失败-消息丢失。 我试图用多种不同的方式配置AMQ,也尝试了几种TX变体,但都不适合我

我对……感兴趣 1/不考虑发送状态的交付 2/立即交付(不推迟至当前发送完成)

建议

更新

昨天我试过这个,效果如预期

 @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)
 }