【问题标题】:Non-transactional jmsTemplate waits for session end非事务性 jmsTemplate 等待会话结束
【发布时间】:2019-05-06 22:49:44
【问题描述】:

我想让jmsTemplate.send() 发送的 jms 消息立即发送,而不是在事务结束后发送。

我尝试将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         |     |
|     | <-----------------------------------+ |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       |     |
|     |                                       +--+--+
|     |                                          |
|     |                                          |
|     |                                          |
+-----+                                          |

【问题讨论】:

    标签: java spring jms activemq spring-transactions


    【解决方案1】:

    解决方案/解决方法

    我通过直接使用 MessageProducer 使其工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多