【问题标题】:Asynchronous send to a queue using Spring Jms issue使用 Spring Jms 问题异步发送到队列
【发布时间】:2013-05-05 09:16:55
【问题描述】:

当我需要异步写入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)
    }

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

【问题讨论】:

  • 这确实是异步工作的;是什么让您认为它会等待消费者?
  • 这是评论,不是答案

标签: java spring asynchronous activemq spring-jms


【解决方案1】:

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

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

但是,如果 ActiveMQ 代理的 producer flow control 启动以防止生产者向代理发送消息,则发送可能会阻塞。这也是可配置的,既可以完全禁用它,也可以在代理上增加memory limits 以了解何时启动。

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

【讨论】:

  • JmsTemplate 同步从连接工厂获取连接。如果尚未建立连接或根本无法建立连接,是否会发生发送延迟?如果是,那么确保完整的 JmsTemplate 处理在任何情况下都保持异步的最佳解决方法是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2020-04-05
  • 2019-05-28
  • 2017-07-08
  • 2011-05-03
  • 2012-12-15
  • 2016-05-02
相关资源
最近更新 更多