国际贸易相关网站,管理咨询有限公司的经营范围,成功的wordpress网站,asp网站安全在rabbitMq消费端#xff0c;有三种应答模式#xff1a;
none#xff1a;不处理。即消息投递给消费者后立刻 ack 消息会立刻从MQ删除。非常不安全#xff0c;不建议使用 manual#xff1a;手动模式。需要自己在业务代码中调用api#xff0c;发送 ack 或 reject#xff…在rabbitMq消费端有三种应答模式
none不处理。即消息投递给消费者后立刻 ack 消息会立刻从MQ删除。非常不安全不建议使用 manual手动模式。需要自己在业务代码中调用api发送 ack 或 reject存在业务入侵但更灵活 auto自动模式。SpringAMQP利用AOP对我们的消息处理逻辑做了环绕增强当业务正常执行时则自动返回 ack 。当业务出现异常时根据异常判断返回不同结果 如果是业务异常会自动返回 nack 如果是消息处理或校验异常自动返回 reject
none基本用不到在这不做讨论
一、auto模式默认模式这种是在配置文件中直接设置参数进行处理。
#应答模式 手动应答需要开发者手动应答
spring.rabbitmq.listener.simple.acknowledge-modeAUTO#批量预抓取数量,提高执行效率
spring.rabbitmq.listener.simple.prefetch 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval 3000
#重试间隔倍数默认值是1
spring.rabbitmq.listener.simple.retry.multiplier 2
#最大间隔时间默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval 15000
消费时会按照参数进行重试如果达到最大重试次数还没有成功会丢弃掉消息。
如果在消费时还没走完整个方法而停止整个服务则在重新启动服务时会重新消费这个消息。
二、manual手动应答此配置下上面配置文件设置的重试参数都不会生效需要特别注意。
1、手动应答模式需要用户自己决定消息是丢弃或者重新放回队列还可以结合死信队列对消息进行重试处理。
2、手动应答中两个重要方法basicAck、basicNack
channel.basicAck(long deliveryTag, boolean multiple); channel.basicNack(long deliveryTag, boolean multiple, boolean requeue) ; 手动模式 若消息没成功消费时,若给队列拒绝(basicNack),则会进入死循环,若不给拒绝不进行basicAck 抛出异常(重试机制生效) 则消息会堆积在队列中,后续投递的消息也会堆积并不会被消费