我正在处理大容量流〜每秒500+ msgs,使用带有10个并发消费者的SimpleMessageListenerContainer从Spring AMQP + Rabbit消耗数据,我必须每隔15分钟对Db进行一些检查并重新加载某些属性对于处理,这是通过石英触发器完成的,每15分钟触发一次,停止SimplelistenerContainer,完成必要的工作并再次启动Container。
当应用程序启动时,一切正常,当触发器触发并且Container重新启动时,我看到多次传递相同的消息,这会导致大量重复。消费者没有抛出任何消息。
消息侦听器
class RoundRobinQueueListener implements MessageListener {
@Override
public void onMessage(Message message) { //do processing
}
}
在应用启动期间设置并行使用者并启动消费者
final SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
RoundRobinQueueListener roundRobinListener = RoundRobinQueueListener.class.newInstance();
messageListenerContainer.setQueueNames(queueName);
messageListenerContainer.setMessageListener(roundRobinListener);
messageListenerContainer.setConcurrentConsumers(10);
messageListenerContainer.setChannelTransacted(true);
石英触发器
void execute(JobExecutionContext context) throws JobExecutionException {
messageListenerContainer.stop()
//Do db task, other processing
messageListenerContainer.start()
}
答案 0 :(得分:0)
看起来您的消息现在已被消费者确认。如果您没有使用自动确认模式,则需要自己确认消息(也可以在SimpleMessageListenerContainer处配置)。否则,代理会假定邮件未成功处理并尝试再次传递。