我有一个传入数据流,作为单独的消息发送到RabbitMQ。
我想将这些内容发送到需要一批邮件的服务。当我有一批1000条消息或5秒过期时,我需要将请求发送到服务。这可以使用SimpleMessageListenerContainer吗?
SimpleMessageListenerContainer支持事务,但是这对5秒超时没有帮助。我确实查看了方法doReceiveAndExecute(BlockingQueueConsumer consumer)和" receiveTimeout",但由于此变量在事务循环内,我最终可能每条消息等待5秒(1000 * 5秒= 83分钟)。 / p>
我目前有一个通道感知侦听器,它将消息批处理到批量处理器,以管理我的超时和队列长度。 SimpleMessageListenerContainer设置为手动确认。但是,当侦听器在消息实际发送到服务之前返回时,我偶尔会遇到问题,因为当我关闭频道时,我会发出消息。
我考虑过编写自己的ListenerContainer,将整个BlockingQueueConsumer发送给Listener。这是唯一的解决方案还是有人设法做了类似的事情?
答案 0 :(得分:2)
您可以使用ChannelAwareMessageListener,
集acknowledgeMode=MANUAL
;积累听众的分娩;启动计时器(计划任务)以在+5秒内执行并保持对通道的引用。当新的交货到货时,取消任务,将新的交货添加到集合中。
当1000次送货到货时(或计划的任务开始);调用你的服务;然后使用channel.basicAck()
(多个)来处理已处理的消息。
你有一些竞争条件要处理,但它应该很容易。也许另一个批处理队列最简单,其他一些线程等待批处理到达该队列。