使用Spring Jms问题异步发送到队列

时间:2013-05-10 16:10:55

标签: java spring asynchronous activemq spring-jms

当我需要异步写入activemq中的队列时,我有一个要求。我正在使用Spring Jms来做到这一点。这是我的spring上下文文件中的接线

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

但上述似乎是同步工作,而不是异步。我需要在这里添加任何使流程异步的东西(我的意思是,App'A'写入队列。它应该写入队列并忘记,不要等到App'B'从队列中取出它处理它。)

1 个答案:

答案 0 :(得分:5)

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

您可以在连接URI上配置这些内容,如下所示:tcp://localhost:61616?jms.useAsyncSend=true

如果ActiveMQ Broker的producer flow control启动以阻止生产者使用消息充斥Broker,则发送可以阻止。这在完全禁用它方面也是可配置的,并且还可以增加Broker上的memory limits以确定何时可以启用它。

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