2

当我需要异步写入activemq中的队列时,我有一个要求。我正在使用 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)
    }

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

4

1 回答 1

6

在正常情况下,就等待消费者获取队列的消息而言,JmsTemplate 发送永远不会同步。然而,发送可以是同步的,因为它等待来自代理的响应,表明它已经接收并存储了消息。这样您就有了成功的迹象,因为队列必须确保它们是可靠的。您可以在 ActiveMQConnectionFactory 中配置许多东西来控制它。设置选项useAsyncSend将强制您的发送不等待代理 ACK(如果这是您想要的)。这些选项都记录在案

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

但是,如果 ActiveMQ 代理的生产者流控制启动以防止生产者向代理中充斥消息,则发送可能会阻塞。这也是可配置的,既可以完全禁用它,也可以增加 Broker 上的内存限制以应对何时启动。

最后,如果与代理的连接丢失并且您正在使用故障转移传输让您的客户端自动重新 连接,则生产者发送可能会阻塞。

于 2013-05-11T10:19:12.337 回答