Нетранзакционный jmsTemplate ожидает завершения сеанса - PullRequest
0 голосов
/ 06 мая 2019

Я хотел бы, чтобы сообщения jms, отправленные jmsTemplate.send(), доставлялись немедленно, а не после завершения транзакции.

Я попытался установить isSessionTransacted на false, но это не помогает.Несмотря на то, что jmsTemplate.send(...) выполнено, я не вижу его в брокере.

Моя настройка:

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
    JmsTemplate template = new JmsTemplate(connectionFactory);
    //
    template.setSessionTransacted(false);
    // messages are ack-ed with message.acknowledge()
    template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return template;
}

@Bean
public ActiveMQConnectionFactory connectionFactory() {
    ActiveMQConnectionFactory factory = new 
        ActiveMQConnectionFactory(brokerUsername, brokerPassword, brokerURL);
    factory.setTransactedIndividualAck(true);
    factory.setAlwaysSyncSend(true);
    factory.setAlwaysSessionAsync(false);
    factory.setUseCompression(true);
    return factory;
}

@Bean
public DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory(
        ActiveMQConnectionFactory jmsConnectionFactory,
        DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, jmsConnectionFactory);
    factory.setSessionTransacted(false);
    factory.setTransactionManager(null);
    return factory;
}

Есть ли способ заставить jmsTemplate немедленно отправлять сообщения?Я использую ActiveMQ и Spring Boot 2.

Когда приходит сообщение, я делаю следующее:

@JmsListener
public void test(...) {
  processRequest(...) // process request here
  message.acknowledge();
  jmsTemplate.send(...)  // send response
  // some transaction handling
}
 sender                                       receiver
   +                                             +
   |                                             |
   |                                             |
+--+--+ +---------------------------------->  +--+--+  
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |          not sent immediately         |     |
|     | <-----------------------------------+ |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       +--+--+
|     |                                          |
|     |                                          |
|     |                                          |
+-----+                                          |

1 Ответ

0 голосов
/ 06 мая 2019

Решение / обходной путь

Я сделал это с помощью MessageProducer напрямую:

MessageProducer messageProducer = session.createProducer(message.getJMSReplyTo());
messageProducer.send(createResponse(message, outgoingEntity, session));
session.commit();
messageProducer.close();
...