rabbitmq重试机制

2023-11-14

1、应答模式

NONE

可以称之为自动回调,即使无响应或者发生异常均会通知队列消费成功,会丢失数据。

AUTO

自动检测异常或者超时事件,如果发生则返回noack,消息自动回到队尾,但是这种方式可能出现消息体本身有问题,返回队尾其他队列也不能消费,造成队列阻塞。

MANUAL

手动回调,在程序中我们可以对消息异常记性捕获,如果出现消息体格式错误问题,手动回复ack,接着再次调用发送接口把消息推到队尾。

2、java示例

2.1 pom.xml

<dependencies>
	<!-- spring boot -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-amqp</artifactId>
	</dependency>
</dependencies>

2.2 配置文件application.yml

spring:
  application:
    name: rabbitmq
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: pwd
    listener:
      simple:
        retry:
          enabled: true #是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
          max-attempts: 5 #最大重试次数
          initial-interval: 5000 #重试间隔时间(单位毫秒) 
          max-interval: 1200000 #重试最大时间间隔(单位毫秒) 
          multiplier: 5 #应用于前一重试间隔的乘法器。

2.3 配置类

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/** 
 * @ClassName: TopicRabbitConfig 
 * @Description: 
 * @author weiyb 
 * @date 2018年2月26日 下午4:38:16  
 */
@Configuration
public class TopicRabbitConfig {

	public final static String QUEUE_NAME = "spring-boot-queue";
	public final static String EXCHANGE_NAME = "spring-boot-exchange";
	public final static String ROUTING_KEY = "spring-boot-key";

	/**
	 * 创建队列
	 * @return
	 * @author weiyb 
	 */
	@Bean("queueMessage")
	public Queue queueMessage() {
		return new Queue(QUEUE_NAME);
	}


	/**
	 * 创建一个 topic 类型的交换器
	 * @return
	 * @author weiyb 
	 */
	@Bean("exchange")
	TopicExchange exchange() {
		return new TopicExchange(EXCHANGE_NAME);
	}

	/**
	 * 使用路由键(routingKey)把队列(Queue)绑定到交换器(Exchange)
	 * @param queueMessage
	 * @param exchange
	 * @return
	 * @author weiyb 
	 */
	@Bean
	Binding bindingExchangeMessage(@Qualifier("queueMessage") Queue queueMessage,@Qualifier("exchange") TopicExchange exchange) {
		return BindingBuilder.bind(queueMessage).to(exchange).with(ROUTING_KEY);
	}
}

2.4 消费者(监听)

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.spring.pro.config.exchange.TopicRabbitConfig;
import com.spring.pro.config.exchange.transaction.TopicRabbitConfigTransaction;
import com.spring.pro.model.User;

@Component
public class HelloReceiver {
	private Logger logger = LoggerFactory.getLogger(getClass());

	@RabbitListener(queues = TopicRabbitConfig.QUEUE_NAME)
	public void process11(User user) {
		logger.info("Receiver  process11: " + JSON.toJSONString(user));
		// 这里抛出异常,测试消息重发机制
//		throw new RuntimeException("***********");
	}
}

2.5 model

import java.io.Serializable;

/**
 * @Title: User.java
 * @Package com.spring.pro.model
 * @Description:
 * @author ybwei
 * @date 2018年11月22日 下午2:46:10
 * @version V1.0
 */
public class User implements Serializable {

	private static final long serialVersionUID = 337531670671807745L;
	private String id;
	private String name;
	private int age;

	public User() {
		super();
	}

	public User(String id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

2.6 生产者

import java.util.Date;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.spring.pro.config.exchange.TopicRabbitConfig;
import com.spring.pro.model.User;

@Component
public class HelloSender {

	@Autowired
	private AmqpTemplate rabbitTemplate;

	public void send1() {
		User user=new User("1", "张三", 12);
		this.rabbitTemplate.convertAndSend(TopicRabbitConfig.EXCHANGE_NAME, TopicRabbitConfig.ROUTING_KEY, user);
	}

}

2.7 测试

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.spring.pro.send.HelloSender;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqHelloTest {

	@Autowired
	private HelloSender helloSender;

	@Test
	public void hello1() throws Exception {
		helloSender.send1();
	}

}

3、应用场景

  1. 常用的mq通信。
  2. 上游向下游回调通知策略。配置文件中的max-attempts(最大重试次数),multiplier(应用于前一重试间隔的乘法器)可以制定策略。

测试重试,第二种方式的日志如下:

[INFO ] 2018-11-22 18:03:51.853 [SimpleAsyncTaskExecutor-1] c.spring.pro.receiver.HelloReceiver - Receiver  process11: {"age":12,"id":"1","name":"张三"}
[INFO ] 2018-11-22 18:03:56.881 [SimpleAsyncTaskExecutor-1] c.spring.pro.receiver.HelloReceiver - Receiver  process11: {"age":12,"id":"1","name":"张三"}
[INFO ] 2018-11-22 18:04:21.893 [SimpleAsyncTaskExecutor-1] c.spring.pro.receiver.HelloReceiver - Receiver  process11: {"age":12,"id":"1","name":"张三"}
[INFO ] 2018-11-22 18:06:26.907 [SimpleAsyncTaskExecutor-1] c.spring.pro.receiver.HelloReceiver - Receiver  process11: {"age":12,"id":"1","name":"张三"}

当前时间间隔=上次重试间隔*multiplier。

当前时间间隔<max-interval(重试最大时间间隔)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rabbitmq重试机制 的相关文章

随机推荐

  • asp.net jquery ajax 调用远程接口 实例,使用html+ashx+ajax实现asp.net前后端数据交互的实例...

    日期 2020 07 24 实例 输入经纬度 调用百度地图api显示 并随机生成折线显示图中 目录 准备工作 前端框架实现 JS库 jquery库 的引用和准备写JS代码 实现用后端交互的框架 ajax 后端读取数据 处理数据 利用给定的经
  • 排列的生成(二) —— 序数法

    1 定义 n n n个元素的全排列有 n n n 个 如果将排列按顺序编号 并能够按照某种方法建立起每一个序号与一个排列之间的对应关系 那么就可以根据序号确定排列 反过来也可以根据排列确定它的序号 根据排列的序号生成对应排列的方法就称为序数
  • PCI-PTS v6规范中对算法类型及强度的要求

    所批准的算法是基于NIST SP 800 57 Part1 Rev 4第4节中所列出的算法 Hash函数 只允许SHA2和SHA3家族额算法 输出大小需要 gt 255bit MD5和SHA 1不能使用 用于加密和解密的对称密钥算法 必须使
  • AB Testing

    A B Testing 说到决策 必然就是一道选择题 是A还是B this is a question 如何使用风险 代价最小的方法 找到最适合生存的方案 在企业应用中 就显得及其重要 而物竞天择 优胜劣汰 使得A B Testing尤为重
  • 五、自适应阈值与轮廓检测应用实例——细胞计数统计

    教程汇总 python基础入门系列 假设有这样一个任务 通过显微镜拍下的某藻类细胞的玻片图 需要统计图中细胞个数 如果每天都要人工处理这项工作 那么将会浪费大量的时间与人力 我们既然学习了python那么自然可以想办法自动化高效率 偷懒 的
  • python3.9.0 + robotframework + selenium3 实例体验

    在win10上安装python3 9 0 robotframework中我们做了基本的使用robot framework的环境搭建 这一章主要通过一个简单的实例来体验下robot framework的使用方式 运行 报告和日志 非常漂亮的自
  • matlab-图形采样及灰度级转换

    目录 一 图像采样 1 实验内容 2 采样原理 3 实验程序 4 实验结果与分析 5 思考题 二 图像类型转换 1 实验内容 2 实验原理 3 程序 4 实验结果与分析 5 思考题 一 图像采样 1 实验内容 试对任意一幅图像分别进行 4
  • oracle数据和表迁移,oracle 数据库之间 表数据的 迁移

    主要是 需要将 正式环境的数据库 和测试环境的数据库的 表 数据同步一下 方便测试 这样的效果 可以使用 数据库的 备份 exp imp 等其他的方式 可是这样的方式 需要 在 电脑里面 安装 oracle 客户端 本人比较懒 所以 就使用
  • 当Eclipse出错的时候

    某天 当你打开Eclipse的时候 弹出这种路径错误的界面 那么 该怎么办呢 参考 https zhidao baidu com question 1497777962705951219 html 正确的做法当然不是无视它 首先 按Win
  • 开发质量问题复盘总结-pua性质的标题

    测试开发如何撕起来 测试流程 版本提测 集成 发布计划与大盘保持一致 RD自测 冒烟不通过的要求RD录自测视频 提测不通过发邮件打回 0106版本打回一次 gt 提测 gt 提测前PM验收需求基本功能 目前这个点S2做的不是很好 gt QA
  • conda activate 报错

    新装了个Anacconda 激活环境的时候报错 C Users 17334 gt conda activate CommandNotFoundError Your shell has not been properly configured
  • linux上清空一个文件,技术

    在 Linux 终端下处理文件时 有时我们想直接清空文件的内容但又不必使用任何 Linux 命令行编辑器 去打开这些文件 那怎样才能达到这个目的呢 在这篇文章中 我们将介绍几种借助一些实用的命令来清空文件内容的方法 注意 在我们进一步深入了
  • 如何用Jenkins复制已有项目的配置

    文章目录 环境版本 1 创建一个新JOB 2 输入新JOB的名字 3 填入要COPY的JOB名字 4 点击OK 5 点击APPLY 参考链接 环境版本 Jenkins 2 107 1 如何在和已有的项目配置相同的任务 1 创建一个新JOB
  • 数字媒体导论(习题答及答案01)

    第一章 1 单选题 数字媒体按照 可以分为离散媒体和连续媒体 A 时变特征 B 获取方式 C 人类感觉特征 D 媒体组成属性 我的答案 A正确答案 A 2 单选题 计算机记录和传播的信息媒体的一个共同的重要特征就是信息的最小单元是 A 字节
  • RecyclerView使用介绍

    http www jcodecraeer com a anzhuokaifa androidkaifa 2014 1118 2004 html
  • 【react】 路由的基本使用 ===

    目录 React 路由介绍 react模拟hash路由的实现 React路由使用的基本 路由三大对象之 Router 路由三大对象之 Link Link NavLink 路由三大对象之 Route route的作用和格式 匹配规则 exac
  • unity 导出函数给 Lua 调用

    Assets Core ToLua Editor Custom CustomSettings cs using UnityEngine using System using System Collections Generic using
  • 【敬伟ps教程】亮度与色阶看懂直方图

    文章目录 亮度 对比度 色阶 调整输入色阶 调整输出色阶 调节原色通道 调整图层 亮度 对比度 控制明暗的视觉因素 三要素之一 明度 在拾色器中修改 HSB 中的 B 改为较低的值即可调整明度 明度较低时 RGB色值偏低 CMYK色值较高
  • 旋转矩阵推导

    个人学习 水平不高 请指正 目录 前言 一 前置知识 二 二维平面旋转 编辑 三 三维推广 1 右手坐标系 2 绕x轴旋转 3 z轴与y轴 四 完整草稿 五总结 前言 最近在学平衡小车 学习卡尔曼滤波 加速度计解算姿态角时用到了旋转矩阵 所
  • rabbitmq重试机制

    1 应答模式 NONE 可以称之为自动回调 即使无响应或者发生异常均会通知队列消费成功 会丢失数据 AUTO 自动检测异常或者超时事件 如果发生则返回noack 消息自动回到队尾 但是这种方式可能出现消息体本身有问题 返回队尾其他队列也不能