zoukankan      html  css  js  c++  java
  • 【rabbitmq】之消费端手动ack

    rabbitmq默认是自动ack,消费端只要消费,mq服务就会删除这条消息。

    我们想象以下场景:

    假如我们消费服务出现异常,这条消息被mq服务删除,当我们修复了消费服务,但是无法主动重新消费这条消息,这种业务逻辑显然是不可行的。

    正常业务逻辑应该是本地业务执行成功,手动ack这条消息。那有的小伙伴就说了,业务执行完毕,手动ack的时候恰好服务宕机了,重启这不是会造成重复消费吗?没错,这就牵扯mq的另一个问题了,mq消息重复消费,后续文章会写如何解决这个问题。本文主要讲解mq的手动ack

    mq消费端手动ack,是保证可靠性消费的核心保障。

    application.properties配置

    server.port=8080
    
    spring.rabbitmq.host=dev-mq.ttsingops.com
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=cddayuwen
    spring.rabbitmq.password=cddayuwen@123
    spring.rabbitmq.virtual-host=/cd
    #发布者确认
    spring.rabbitmq.publisher-confirm-type=correlated
    #发布者到达确认
    spring.rabbitmq.publisher-returns=true
    
    spring.rabbitmq.listener.type=simple
    
    #simple关闭自动ack,手动ack
    spring.rabbitmq.listener.simple.acknowledge-mode=manual
    ### 开启重试机制
    spring.rabbitmq.listener.simple.retry.enabled=true
    #最大重试传递次数
    spring.rabbitmq.listener.simple.retry.max-attempts=3
    #第一次和第二次尝试传递消息的间隔时间 单位毫秒
    spring.rabbitmq.listener.simple.retry.initial-interval=5000ms
    #最大重试时间间隔,单位毫秒
    spring.rabbitmq.listener.simple.retry.max-interval=300000ms
    #应用前一次重试间隔的乘法器,multiplier默认为1
    spring.rabbitmq.listener.simple.retry.multiplier=3
    #以上配置的间隔0s  5s  15s  45s
    
    
    #重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
    spring.rabbitmq.listener.simple.default-requeue-rejected=true
    
    ### 模板配置
    ##设置为 true 后 消费者在消息没有被路由到合适队列情况下会被return监听,而不会自动删除
    spring.rabbitmq.template.mandatory=true

    java代码,https://www.cnblogs.com/gyjx2016/p/13622097.html

    mq消息被消费

    image

    但是mq服务器的消息并没有被删除

    image

    代码改造如下

    image

    参考文献:

    1、https://docs.spring.io/spring-boot/docs/2.2.11.BUILD-SNAPSHOT/reference/html/appendix-application-properties.html#common-application-properties

    2、https://docs.spring.io/spring-boot/docs/2.2.11.BUILD-SNAPSHOT/reference/html/spring-boot-features.html#boot-features-amqp

  • 相关阅读:
    Ueeidor 使用
    springMvc 拦截器
    redis 设置密码
    freemarker 定义公共header
    freemarker macro 使用
    freemarker ! 用法
    Android 远程连接数据库。。。。。
    Android Studio 配置
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    表单,table的css
  • 原文地址:https://www.cnblogs.com/gyjx2016/p/13704504.html
Copyright © 2011-2022 走看看