Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 限制入站AMQP消息_Design Patterns_Integration_Spring Integration_Messaging_Spring Amqp - Fatal编程技术网

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
接收()
消息,但这比消息驱动的适配器效率低。

谢谢,加里-这不是一个真正强烈的反对拿起邮件,然后等待处理它们。我认为如果我知道目前无法处理它们,那么不使用它们会更干净(从设计角度来看)。但最终,在流量开始时有一个节流阀也是不错的。