【问题标题】:How to receive all the prefetch rabbitmq messages using spring framework?如何使用spring框架接收所有预取rabbitmq消息?
【发布时间】:2015-01-12 06:54:48
【问题描述】:

我正在学习如何使用 SimpleMessageListenerContainer 来接收 rabbitmq 消息。我的侦听器容器有 prefetchCount = 1000。但是我的侦听器工作人员实现了 MessageListener 接口,它一次只接收一条消息。是否有接收消息列表的接口?如果没有,我该如何接收消息列表?我不想一次处理一条消息,而是要处理它们的列表,以便我可以进行批量插入/更新。我还想对发送给我的所有消息进行一次确认。

谢谢,

肖恩·阮

【问题讨论】:

    标签: java spring rabbitmq spring-jms


    【解决方案1】:

    没有这样的 API;即使是低级的rabbit客户端消费者也一次传递一条预取消息(通过handleDelivery)。

    您必须自己将它们累积到一个列表中。

    使用txSize 属性(将其设置为与预取相同)在 1000 次交付后发送单个确认。

    【讨论】:

    • 有没有办法知道我收到的第 n 条消息,如果 nth == 1000,我可以确认它?
    • 如果你使用txSize=1000,容器会在1000之后ack;如果您想确认自己,请使用ChannelAwareMessageListener,将确认模式设置为MANUAL(而不是默认的AUTO)并在频道上发出basicAck(使用来自message.gertMessageProperties().getDeliveryTag() 的deliveryTag)。
    • @Gary:我也有类似的情况。我知道这是非常规的使用,但我的听众调用第三方服务,如果我通过字符串加入 N(比如 10)个消息(json)主体,它的性能会更好。您建议使用 txSize 并在列表中累积。但我不知道该怎么做。我可以使用自动容器确认。我应该使用什么监听器?我正在使用“@Bean public MessageListener messageListener() { return new MessageListener() { public void onMessage(Message message) { ....}”
    • 只需将消息累积到消息侦听器中的线程安全集合中,然后当您达到所需数量时,将它们全部发送到下一阶段。当阶段完成时,将发送确认(只要您的 txSize 与您的集合大小匹配)。
    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多