2013-05-10 50 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