Java Spring Boot/AMQP-限制处理的消息数

Java Spring Boot/AMQP-限制处理的消息数,java,spring-boot,rabbitmq,spring-amqp,Java,Spring Boot,Rabbitmq,Spring Amqp,我有一个使用spring boot AMQP库的spring boot应用程序 pom.xml: org.springframework.boot 弹簧启动机amqp 我如何让它处理并确认一条单一的消息,然后优雅地退出 可以在不确认的情况下退出,但似乎无法确定如何确认消息,然后退出 您只需使用一个rabbitmplate.receive()(或receiveAndConvert())方法,而不必使用侦听器容器。您只需使用一个rabbitmplate.receive()(或receiveAnd

我有一个使用spring boot AMQP库的spring boot应用程序

pom.xml:


org.springframework.boot
弹簧启动机amqp
我如何让它处理并确认一条单一的消息,然后优雅地退出


可以在不确认的情况下退出,但似乎无法确定如何确认消息,然后退出

您只需使用一个
rabbitmplate.receive()
(或
receiveAndConvert()
)方法,而不必使用侦听器容器。

您只需使用一个
rabbitmplate.receive()
(或
receiveAndConvert()
)方法而不是使用侦听器容器。

您可以按照以下步骤操作:

  • 使用Spring的
    RabbitListener
    作为侦听器(有关完整示例,请参阅)
  • 在侦听器类中将
    AtomicInteger
    声明为计数器
  • 监听消息后增加计数器(即,
    listen
    方法执行时无任何异常)。Spring仅在方法成功执行时发送ack
  • 如果计数器的值大于
    0
    (或大于配置的阈值),请通过调用
    stop()
    方法停止侦听
  • 使用
    @Value
    配置阈值,并使用
    incrementAndget()
    方法自动递增计数器

您可以按照以下步骤操作:

  • 使用Spring的
    RabbitListener
    作为侦听器(有关完整示例,请参阅)
  • 在侦听器类中将
    AtomicInteger
    声明为计数器
  • 监听消息后增加计数器(即,
    listen
    方法执行时无任何异常)。Spring仅在方法成功执行时发送ack
  • 如果计数器的值大于
    0
    (或大于配置的阈值),请通过调用
    stop()
    方法停止侦听
  • 使用
    @Value
    配置阈值,并使用
    incrementAndget()
    方法自动递增计数器

那么,您只想确认并处理一条消息?如果队列有100条消息怎么办?@DarshanMehta是的,即使队列有100条消息,我也要处理一条消息并退出。您可以使用与此类似的方法:。可以添加一个
AtomicInteger
,并在计数达到1时停止消费?就ack而言,只有当您的
侦听器
方法正常退出时,Spring才会发送ack。如果调用
stop()
,它将不会应答,因此,该消息将可供其他用户使用。@DarshanMehta也许我可以在处理第一条消息结束时增加计数,然后在处理第二条消息开始时退出,如果计数正好达到我指定的限制(在我的情况下为1),
incrementAndGet()
是您希望与
AtomicInteger一起使用的方法,是的,增加方法末尾的计数并在开头进行检查是一个好主意。我会使用
@Value
来配置应用程序在退出前需要读取的消息数。那么,您想确认并只处理一条消息吗?如果队列有100条消息怎么办?@DarshanMehta是的,即使队列有100条消息,我也要处理一条消息并退出。您可以使用与此类似的方法:。可以添加一个
AtomicInteger
,并在计数达到1时停止消费?就ack而言,只有当您的
侦听器
方法正常退出时,Spring才会发送ack。如果调用
stop()
,它将不会应答,因此,该消息将可供其他用户使用。@DarshanMehta也许我可以在处理第一条消息结束时增加计数,然后在处理第二条消息开始时退出,如果计数正好达到我指定的限制(在我的情况下为1),
incrementAndGet()
是您希望与
AtomicInteger一起使用的方法,是的,增加方法末尾的计数并在开头进行检查是一个好主意。我会使用
@Value
来配置应用程序在退出前需要读取的消息数量。因此,这将基于请求使用消息,而不是侦听消息-很好的想法这将基于请求使用消息,而不是侦听消息-很好的主意
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>