限制入站AMQP消息

时间:2015-12-07 09:11:11

标签: design-patterns integration spring-integration messaging spring-amqp

我的系统如下:

[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();

Service1ServiceN可以进行通信(它是相同的JVM),因此我可以在它们之间实现锁定机制,以便在继续执行之前service1.process()阻塞执行如果"在处理"达到邮件限制。这就是 - 如果我理解正确的话 - @Gary Russell在this comment建议。然而,它将导致从代理中获取消息并在未处理状态下暂停一段时间。有没有办法不从队列中获取消息?

@Artem Bilan answer使用SimpleMessageListenerContainer.stop()/.start()看起来非常重量级,看看实现以及将被调用的所有关闭/启动逻辑。

这两个答案现在已经两年了。还有更好的建议吗?

1 个答案:

答案 0 :(得分:1)

不使用消息驱动的适配器,没有。经纪人会将消息推送给消费者(根据prefetch-count)。

我不确定你为什么反对这个处于非英国状态的信息。

另一种方法是使用简单的轮询<int:inbound-channel-adapter/>,在轮询器中使用10个线程,在适配器调用的POJO中,使用RabbitTemplatereceive()消息,但是这样效率低于消息驱动的适配器。