Java SimpleMessageListenerContainer批量消息处理

Java SimpleMessageListenerContainer批量消息处理,java,spring,rabbitmq,spring-amqp,spring-rabbit,Java,Spring,Rabbitmq,Spring Amqp,Spring Rabbit,我有一个作为单独消息发送到RabbitMQ的传入数据流 我想将这些发送到需要一批消息的服务。当我收到一批1000条消息或5秒过期时,我需要向服务发送请求。这是否可以使用SimpleMessageListenerContainer SimpleMessageListenerContainer支持事务,但是这对5秒超时没有帮助。我确实查看了方法doReceiveAndExecute(BlockingQueueConsumer)和“receiveTimeout”,但由于该变量位于事务循环内,我可能会在

我有一个作为单独消息发送到RabbitMQ的传入数据流

我想将这些发送到需要一批消息的服务。当我收到一批1000条消息或5秒过期时,我需要向服务发送请求。这是否可以使用SimpleMessageListenerContainer

SimpleMessageListenerContainer支持事务,但是这对5秒超时没有帮助。我确实查看了方法doReceiveAndExecute(BlockingQueueConsumer)和“receiveTimeout”,但由于该变量位于事务循环内,我可能会在每条消息中等待5秒(1000*5秒=83分钟)

我目前有一个通道感知侦听器,它将消息分批处理到一个大容量处理器中,该处理器将管理我的超时和队列长度。SimpleMessageListenerContainer设置为手动确认。但是,当侦听器在消息实际发送到服务之前返回时,我偶尔会在通道关闭时确认消息时遇到问题


我曾考虑编写自己的ListenerContainer,将整个BlockingQueueConsumer发送给侦听器。这是唯一的解决方案还是已经有人做过类似的事情了?

您可以使用
ChannelAwareMessageListener,
set
ackknowledgemode=MANUAL
;在听者中积累所传递的信息;启动计时器(计划任务)在+5秒内执行,并保留对通道的引用。当新交付到达时,取消任务,将新交付添加到集合中

当1000次交付到达时(或计划任务触发);调用您的服务;然后使用
channel.basicAck()
(多个)确认已处理的消息

你会有一些比赛条件需要处理,但这应该很容易。也许另一个批处理队列最容易,因为其他线程正在等待批处理到达该队列

编辑


从2.2开始,
SimpleMessageListenerContainer
支持以本机方式传递成批消息-请参阅

从2.2版开始,可以使用
SimpleMessageListeneContainer
在消费者端(生产者发送离散消息的地方)创建批次

设置容器属性
consumerBatchEnabled
以启用此功能
debatchinenabled
也必须为true,以便容器负责处理这两种类型的批。当consumerBatchEnabled为true时,实现
BatchMessageListener
ChannelawarBatchMessageListener
。有关在
@RabbitListener
中使用此功能的信息,请参阅
@RabbitListener with Batching


这几乎和我已经拥有的一样。我希望有什么东西能帮我处理这些复杂的事情。我已经回到我的代码,并修复了一些我的比赛条件。我确实使用了你建议的另一个批次队列。你可能会发现它很有用。如果在
idleEventInterval
中未收到任何消息,容器线程将发布应用程序事件。它应该避免大多数竞争条件,因为事件是在容器线程上发布的@Gary Russell,我还需要以批处理方式接收消息,以便以批处理方式插入它们。但我的是Websphere MQ,如果有办法的话,请建议设置。从2.2开始,
SimpleMessageListenerContainer
支持以本机方式传递成批消息-请参阅。