2017-06-14 62 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。謝謝加里 –