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

use*_*230 2 java spring activemq-classic asynchronous 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>
Run Code Online (Sandbox Code Playgroud)

在我的代码中...我做..

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

        jmsTemplate.send(requestQueue, messageCreator)
    }
Run Code Online (Sandbox Code Playgroud)

但上述似乎同步工作,而不是异步.有什么,我需要在这里,使过程异步(我的意思是添加,应用"A"写入到一个队列.它应该写入队列忘记,不要等到应用程序"B"从队列中拾起,处理它.)

Tim*_*ish 5

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

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

但是,如果ActiveMQ Broker的生产者流控制启动以阻止生产者使用消息充斥Broker,则发送可以阻止.这在可以完全禁用它方面也是可配置的,并且还可以在可能启动时增加Broker 的内存限制.

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