【问题标题】:Batch consuming of JMS messagesJMS消息的批量消费
【发布时间】:2016-06-14 23:56:58
【问题描述】:

MessageListener 接口只定义了一个方法onMessage,它接收一个Message 作为参数。我正在寻找一种从队列中获取多个Messages 的方法,以便我可以处理批处理,然后确认批处理中的所有Messages。

JMS 世界有这样的功能吗?如果不是,ActiveMQ 是否支持作为扩展?

谢谢,米凯尔

【问题讨论】:

标签: java jms activemq


【解决方案1】:

这在JMS 1.1 spec 部分4.5.1 同步交付中有解释:

客户端可以使用 MessageConsumer 向 MessageConsumer 请求下一条消息 其接收方法。有几种不同的接收方式 允许客户端轮询或等待下一条消息。

9.2.2 同步接收消息节中甚至还有一个代码示例:

TextMessage stockMessage;
stockMessage = (TextMessage)receiver.receive();

请注意,在使用轮询和批处理时,您还应该查看确认 - 请参阅4.4.11 消息确认部分了解更多信息。特别有趣的可能是以下内容:

CLIENT_ACKNOWLEDGE - 使用此选项,客户端确认消息 通过调用消息的确认方法。确认消费 消息自动确认收到的所有消息 已由其会话交付。

【讨论】:

  • 现在的问题是如何进行批处理 JMS 异步消费 :) 我发现了以下 JIRA java.net/jira/plugins/servlet/mobile#issue/JMS_SPEC-36。看起来直到 2.1 版才有望实现。你知道这是否可以通过 ActiveMQ 作为扩展来实现?
  • @MickaelMarrache 讨论的主题只是一个方便的功能。使用自己的线程而不是使用 jms 客户端提供的线程通过轮询来处理批处理时没有太大区别,因为 Session 使用单个线程来运行其所有 MessageListeners(第 4.4.14 节客户端代码的串行执行)。
【解决方案2】:

是的,这是常规 JMS API 的一部分。而不是在MessageListener 中进行消费,而是使用MessageConsumer.receive() 在循环中进行。要进行事务批处理,您需要使用SESSION_TRANSACTED 确认模式,并在要发送批处理确认时调用Session.commit()

查看 Apache Camel 中 sjms-batch 组件的源代码,了解它是如何完成的。

【讨论】:

  • 请看我对 SpaceTrucker 回答的评论。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2021-04-24
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2021-06-23
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多