2013-05-10 78 views
2

我需要异步写入到activemq中的队列时有需求。我使用Spring Jms来完成它。这是我的Spring上下文文件使用Spring Jms问题异步发送到队列

<bean id="amqProducerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
     <property name="brokerURL" value="${activemq.broker}"/>   
    </bean> 

    <bean id="pooledProducerConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop" lazy-init="true"> 
     <property name="connectionFactory" ref="amqProducerConnectionFactory" /> 
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory" ref="pooledProducerConnectionFactory" /> 
    </bean> 

而在我的代码中的布线...我..

void sendMessage(JmsTemplate jmsTemplate, String message, String requestQueue) { 
     def messageCreator = { session -> 
      session.createTextMessage(message) 
     } as MessageCreator 

     jmsTemplate.send(requestQueue, messageCreator) 
    } 

但上面似乎是同步工作,不asynchrously。有什么我需要添加在这里使进程异步(我的意思是,应用程序'A'写入队列,它应该写入队列并忘记,不要等到应用程序'B'从队列中选择它并处理它。)

+1

这确实工作异步;是什么让你觉得它会等待消费者? – 2013-05-10 16:50:32

+0

这是一条评论,而不是答案 – 2013-05-10 17:46:17

回答

5

在正常情况下,在等待消费者接收队列消息方面,JmsTemplate发送永远不会同步。然而,发送可以是同步的,因为它等待来自代理的响应,指示它已经接收并存储消息。这是因为队列必须确保它们是可靠的,所以你有成功的迹象。你可以在ActiveMQConnectionFactory中配置很多东西来控制它。设置选项useAsyncSend将强制您的发送不等待经纪人确认,如果这是你想要的。这些选项都是documented

您在连接URI配置这些像这样:但是tcp://localhost:61616?jms.useAsyncSend=true

的发送可以阻止如果ActiveMQ代理的producer flow control踢,以防止生产者从消息充斥经纪人。这是可配置的,无论是完全禁用它还是因为您可以增加代理上的memory limits,因为这可能会引发冲突。

最后,生产者发送可能会阻止与代理的连接丢失,您正在使用Failover Transport让您的客户端自动重新连接。

+0

JmsTemplate从连接工厂**同步**获取连接。如果连接尚未建立或者根本无法建立连接,是否会延迟发送?如果是,那么最好的解决方法是确保完整的JmsTemplate处理在任何情况下都保持异步? – jeromerg 2016-09-16 06:21:07