【问题标题】:Synchronous & Asynchronous Message Receiver in 1 queue (Spring w/ ActiveMQ) JMS API1 个队列中的同步和异步消息接收器(带有 ActiveMQ 的 Spring)JMS API
【发布时间】:2014-11-24 17:43:55
【问题描述】:

我使用 Spring JMS 和 ActiveMQ 作为代理并在 Tomcat 上运行应用程序。 我有一个队列,比如说 queue.a。在我的网络应用程序中,每当我启动我的网络应用程序时,我就已经运行了一个 MessageListener。唯一的事情是,我想同步添加某种队列消费者。我已经尝试使用 JmsTemplate 等。但是当我的两个消费者(监听器异步和消费者同步)都启动并且我触发 .receive() 方法时,发送到队列的消息总是被一直在线的消息监听器吸收自网络应用程序启动以来。超时结束后,同步接收方根本没有消费任何消息。

但是,当我注释掉messageListener时,同步客户运行良好。

我还是个新手,你们有没有办法让我想要的成为可能?谢谢!对不起我的英语不好:(

【问题讨论】:

  • 您是否对消费者和队列配置中的所有内容(预取、独占、优先级等)使用默认值?
  • 我认为是的,因为我是春季使用 JMS 的新手。有没有办法进行配置?是在 beans 配置中吗?我只是按照文档和互联网中的所有内容进行操作
  • 这听起来很像你有一个独家消费者。您是否在接收消息的消费者上设置了类似的东西: YOUR.QUEUE?consumer.exclusive=true 并且您是否验证了使用 receive() 的消费者在队列上有句柄(消费者计数 +1 )?
  • 这是回答这个问题的另一种方式。谢谢 erik,但我已经使用了 consumer.priority。使用 consumer.exclusive 更好吗?嗯,我正在考虑构建相同的实现,但不是使用 2 个消费者,只有 1 个侦听器。是否有任何类型的队列管理器可以使用?
  • 当你想确保只有一个消费者得到消息时,你使用独占消费者(先到先得)。优先级总是会尝试先给最高优先级的消费者消息,但在更高优先级的消费者被占用时给其他消费者一个机会。

标签: java spring queue jms activemq


【解决方案1】:
<bean id="someQueue" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg index="0" value="TEST.QUEUE?consumer.priority=10" />
</bean>

然后,将其设置为您的侦听器/接收器 bean:

<bean id="someReceiver" class="blah.blah.SomeReceiver">
  <property name="destination" ref="someQueue" />
  <property name="jmsTemplate" ref="jmsTemplate" />
</bean>

这能解决您的问题吗?

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2015-01-22
    • 2020-01-16
    • 2018-10-13
    • 2012-01-19
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多