2017-06-14 63 views
0

我必须向2个不同的队列(队列1和队列2)发送消息。但是,我想回滚,如果发送失败的任何队列(队列1或队列2)。在一个事务中发送多个jms消息

我的源代码如下所示。任何人都可以通过这方面的一些投入

public void sendMessage(final Map<String, String> mapMessage) { 

    jmsTemplate.send(queue1, session -> { 
     MapMessage message = session.createMapMessage(); 
     Iterator<Entry<String, String>> it = mapMessage.entrySet().iterator(); 
     while (it.hasNext()) { 
     Map.Entry<String, String> pair = it.next(); 
     message.setStringProperty(pair.getKey(), pair.getValue()); 
     } 
     message.setJMSRedelivered(true); 
     message.setJMSCorrelationID(UUID.randomUUID().toString().replaceAll("-", "")); 
     return message; 
    }); 

    jmsTemplate.send(queue2, session -> { 
     MapMessage message = session.createMapMessage(); 
     Iterator<Entry<String, String>> it = mapMessage.entrySet().iterator(); 
     while (it.hasNext()) { 
     Map.Entry<String, String> pair = it.next(); 
     message.setStringProperty(pair.getKey(), pair.getValue()); 
     } 
     message.setJMSRedelivered(true); 
     message.setJMSCorrelationID(UUID.randomUUID().toString().replaceAll("-", "")); 
     return message; 
    }); 

    } 

回答

1

在进入sendMessage方法之前开始交易,例如,与@Transactional - 请参阅Spring Framework Reference Manual

+0

嗨加里,我尝试了javax和基于spring的@Transactional分开。但是,它没有奏效。我改变了代码如下。有效。但是,我想知道,我们如何做这个声明而不是程序回滚。资源 PlatformTransactionManager jmsTransactionManager; TransactionStatus status = jmsTransactionManager.getTransaction(new DefaultTransactionDefinition());在第二个jmsTemplate.send之后,我使用commit。在异常块中,我使用了回滚。 jmsTransactionManager.commit(status); 或jmsTransactionManager.rollback(status); –

+0

您必须错误配置某些内容。声明式事务应该正常工作。不要试图在这里发表评论代码;几乎不可读。改为编辑问题。仔细阅读参考手册。如果您仍然无法弄清楚,请显示您的所有配置。 –

+0

我能够通过添加spring的@Transactional来解决问题。缺少的部分是Spring引导应用程序类中的EnableTransactionManagement。谢谢加里 –