我的系统如下:
[Q1] --> Service1 --> [Q2] --> ...(processing)... --> ServiceN --> [Outbound queue]
队列是RabbitMQ 3.5.6。我使用的是Spring Integration 4.2.1,Spring AMQP 1.5.1和Spring Integration Java DSL 1.1.0。
我想根据当前正在处理的消息数量以及Q1
未达到的消息来限制Service1
对来自队列Outbound queue
的消息的消耗 - 例如。我想拥有最大值。一次处理10条消息。这是因为处理部分消耗了大量资源,我不想让系统超载。
我对流程初始部分的当前配置如下:
IntegrationFlows
.from(Amqp.inboundAdapter(connectionFactory, "Q1"))
.handle(message -> service1.process(message.getPayload())
.get();
Service1
和ServiceN
可以进行通信(它是相同的JVM),因此我可以在它们之间实现锁定机制,以便在继续执行之前service1.process()
阻塞执行如果"在处理"达到邮件限制。这就是 - 如果我理解正确的话 - @Gary Russell在this comment建议。然而,它将导致从代理中获取消息并在未处理状态下暂停一段时间。有没有办法不从队列中获取消息?
@Artem Bilan answer使用SimpleMessageListenerContainer.stop()/.start()
看起来非常重量级,看看实现以及将被调用的所有关闭/启动逻辑。
这两个答案现在已经两年了。还有更好的建议吗?
答案 0 :(得分:1)
不使用消息驱动的适配器,没有。经纪人会将消息推送给消费者(根据prefetch-count
)。
我不确定你为什么反对这个处于非英国状态的信息。
另一种方法是使用简单的轮询<int:inbound-channel-adapter/>
,在轮询器中使用10个线程,在适配器调用的POJO中,使用RabbitTemplate
到receive()
消息,但是这样效率低于消息驱动的适配器。