отправлять несколько jms-сообщений за одну транзакцию

Мне нужно отправить сообщение в 2 разные очереди (queue1 и queue2). Однако я хочу выполнить откат, если отправка не удалась для какой-либо очереди (queue1 или queue2).

мой исходный код выглядит следующим образом. может кто-нибудь через некоторые материалы по этому поводу.

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

    } 

person Srinivas KK    schedule 14.06.2017    source источник


Ответы (1)


Начните транзакцию перед вводом метода sendMessage, например с @Transactional - см. Справочник по Spring Framework Руководство.

person Gary Russell    schedule 14.06.2017
comment
Привет, Гэри, я пробовал как javax, так и spring @Transactional по отдельности. Но это не сработало. Я изменил код, как показано ниже. Это сработало. Однако мне интересно, как мы можем сделать эту декларацию вместо программного отката. Resource PlatformTransactionManager jmsTransactionManager; Статус TransactionStatus = jmsTransactionManager.getTransaction (новый DefaultTransactionDefinition ()); После второго jmsTemplate.send я использую фиксацию. В блоке исключений я использовал откат. jmsTransactionManager.commit (статус); или jmsTransactionManager.rollback (статус); - person Srinivas KK; 15.06.2017
comment
Вы, должно быть, неправильно сконфигурировали что-то. Декларативные транзакции должны работать нормально. Не пытайтесь помещать здесь код в комментарии; практически не читается. Вместо этого отредактируйте вопрос. Внимательно прочтите справочное руководство. Если вы все еще не можете понять это, покажите всю свою конфигурацию. - person Gary Russell; 15.06.2017
comment
Я могу решить проблему, добавив @Transactional of spring. Отсутствует EnableTransactionManagement в классе приложения весенней загрузки. Спасибо Гэри - person Srinivas KK; 15.06.2017