Design patterns 限制入站AMQP消息
我的系统如下所示:Design patterns 限制入站AMQP消息,design-patterns,integration,spring-integration,messaging,spring-amqp,Design Patterns,Integration,Spring Integration,Messaging,Spring Amqp,我的系统如下所示: [Q1] --> Service1 --> [Q2] --> ...(processing)... --> ServiceN --> [Outbound queue] 队列是RabbitMQ 3.5.6。我正在使用SpringIntegration4.2.1、SpringAMQP1.5.1和SpringIntegrationJavaDSL1.1.0 我想限制Service1对队列Q1中的消息的消耗,这取决于当前正在处理且未到达出站队列的消息数量
[Q1] --> Service1 --> [Q2] --> ...(processing)... --> ServiceN --> [Outbound queue]
队列是RabbitMQ 3.5.6。我正在使用SpringIntegration4.2.1、SpringAMQP1.5.1和SpringIntegrationJavaDSL1.1.0
我想限制Service1
对队列Q1
中的消息的消耗,这取决于当前正在处理且未到达出站队列的消息数量,例如,我希望一次最多处理10条消息。这是因为处理部分消耗了大量资源,我不想让系统过载
我当前对流程初始部分的配置如下所示:
IntegrationFlows
.from(Amqp.inboundAdapter(connectionFactory, "Q1"))
.handle(message -> service1.process(message.getPayload())
.get();
Service1
和ServiceN
可以通信(这是同一个JVM),因此我能够在它们之间实现一个锁定机制,以便Service1.process()
在达到“处理中”消息限制时,在继续执行之前阻塞。加里·拉塞尔(Gary Russell)在一篇文章中建议,如果我理解正确的话,这就是问题所在。但是,这将导致从代理中提取消息,并在未确认状态下在那里挂起一段时间。有没有办法根本不从队列中提取消息
@Artem Bilan使用的SimpleMessageListenerContainer.stop()/.start()
的实现和所有将被调用的关闭/启动逻辑看起来相当重要
两个答案现在都有两年历史了。有更好的建议吗?不使用消息驱动适配器,没有。代理将向使用者推送消息(根据预回迁计数)
我不知道你为什么反对处于未确认状态的消息
另一种方法是使用一个简单的轮询
,轮询器中有10个线程,在适配器调用的POJO中,使用rabbitmplate
来接收()
消息,但这比消息驱动的适配器效率低。谢谢,加里-这不是一个真正强烈的反对拿起邮件,然后等待处理它们。我认为如果我知道目前无法处理它们,那么不使用它们会更干净(从设计角度来看)。但最终,在流量开始时有一个节流阀也是不错的。