基础知识

  1. 虚拟主机 (Virtual Host): 每个 virtual host 拥有自己的 exchanges, queues 等 (类似 MySQL 中的库)
  2. 交换器 (Exchange): 生产者产生的消息并不是直接发送给 queue 的,而是要经过 exchange 路由, exchange 类型如下:
    1. fanout: 把所有发送到该 exchange 的消息路由到所有与它绑定的 queue 中
    2. direct: 把消息路由到 binding key 与routing key 完全匹配的 queue 中
    3. topic: 模糊匹配 (单词间使用”.”分割,”*” 匹配一个单词,”#” 匹配零个或多个单词)
    4. headers: 根据发送的消息内容中的 headers 属性进行匹配
  3. 信道 (Channel): 建立在真实的 TCP 连接之上的虚拟连接, RabbitMQ 处理的每条 AMQP 指令都是通过 channel 完成的

使用示例

RabbitMQ 安装参考: docker 安装rabbitMQ

新建 Spring Boot 项目,添加配置:

spring:
rabbitmq:
host: 192.168.30.101
port: 5672
username: admin
password: admin
virtual-host: my_vhost logging:
level:
com: INFO

1. 基本使用

Queue

@Configuration
public class RabbitmqConfig { @Bean
public Queue hello() {
return new Queue("hello");
} }

Producer

@Component
@EnableAsync
public class SenderTask { private static final Logger logger = LoggerFactory.getLogger(SenderTask.class); @Autowired
private RabbitTemplate rabbitTemplate; @Autowired
private Queue queue; @Async
@Scheduled(cron = "0/1 * * * * ? ")
public void send(){
String message = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); rabbitTemplate.convertAndSend(queue.getName(), message); logger.info(" [x] Sent '" + message + "'");
}
}

Consumer

@Component
@RabbitListener(queues = "hello")
public class ReceiverTask { private static final Logger logger = LoggerFactory.getLogger(ReceiverTask.class); @RabbitHandler
public void receive(String in){
logger.info(" [x] Received '" + in + "'");
}
}

2. fanout

Exchange, Queue, Binding

@Configuration
public class RabbitmqConfig { @Bean
public FanoutExchange fanout() {
return new FanoutExchange("fanoutExchangeTest");
} @Bean
public Queue autoDeleteQueue1() {
return new AnonymousQueue();// 创建一个非持久的,独占的自动删除队列
} @Bean
public Queue autoDeleteQueue2() {
return new AnonymousQueue();
} @Bean
public Binding binding1(FanoutExchange fanout,
Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
} @Bean
public Binding binding2(FanoutExchange fanout,
Queue autoDeleteQueue2) {
return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
}
}

Producer

@Component
@EnableAsync
public class SenderTask { private static final Logger logger = LoggerFactory.getLogger(SenderTask.class); @Autowired
private RabbitTemplate rabbitTemplate; @Autowired
private FanoutExchange fanoutExchange; @Async
@Scheduled(cron = "0/1 * * * * ? ")
public void send(){
String message = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); rabbitTemplate.convertAndSend(fanoutExchange.getName(), "", message); logger.info(" [x] Sent '" + message + "'");
}
}

Consumer

@Component
public class ReceiverTask { private static final Logger logger = LoggerFactory.getLogger(ReceiverTask.class); @RabbitListener(queues = "#{autoDeleteQueue1.name}")
public void receive1(String in){
receive(in, 1);
} @RabbitListener(queues = "#{autoDeleteQueue2.name}")
public void receive2(String in){
receive(in, 2);
} public void receive(String in, int receiver){
logger.info("instance " + receiver + " [x] Received '" + in + "'");
}
}

3. direct

Exchange, Queue, Binding

@Configuration
public class RabbitmqConfig { @Bean
public DirectExchange direct() {
return new DirectExchange("directExchangeTest");
} @Bean
public Queue autoDeleteQueue1() {
return new AnonymousQueue();// 创建一个非持久的,独占的自动删除队列
} @Bean
public Queue autoDeleteQueue2() {
return new AnonymousQueue();
} @Bean
public Binding binding1a(DirectExchange direct,
Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(direct).with("orange");
} @Bean
public Binding binding1b(DirectExchange direct,
Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(direct).with("green");
} @Bean
public Binding binding2a(DirectExchange direct,
Queue autoDeleteQueue2) {
return BindingBuilder.bind(autoDeleteQueue2).to(direct).with("green");
} @Bean
public Binding binding2b(DirectExchange direct,
Queue autoDeleteQueue2) {
return BindingBuilder.bind(autoDeleteQueue2).to(direct).with("black");
}
}

Producer

@Component
@EnableAsync
public class SenderTask { private static final Logger logger = LoggerFactory.getLogger(SenderTask.class); @Autowired
private RabbitTemplate rabbitTemplate; @Autowired
private DirectExchange directExchange; private final String[] keys = {"orange", "black", "green"}; @Async
@Scheduled(cron = "0/1 * * * * ? ")
public void send(){ Random random = new Random(); String key = keys[random.nextInt(keys.length)]; String message = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ " to: " + key; rabbitTemplate.convertAndSend(directExchange.getName(), key, message); logger.info(" [x] Sent '" + message + "'");
}
}

Consumer

@Component
public class ReceiverTask { private static final Logger logger = LoggerFactory.getLogger(ReceiverTask.class); @RabbitListener(queues = "#{autoDeleteQueue1.name}")
public void receive1(String in){
receive(in, 1);
} @RabbitListener(queues = "#{autoDeleteQueue2.name}")
public void receive2(String in){
receive(in, 2);
} public void receive(String in, int receiver){
logger.info("instance " + receiver + " [x] Received '" + in + "'");
}
}

4. topic

Exchange, Queue, Binding

@Configuration
public class RabbitmqConfig { @Bean
public TopicExchange topic() {
return new TopicExchange("topicExchangeTest");
} @Bean
public Queue autoDeleteQueue1() {
return new AnonymousQueue();// 创建一个非持久的,独占的自动删除队列
} @Bean
public Queue autoDeleteQueue2() {
return new AnonymousQueue();
} @Bean
public Binding binding1a(TopicExchange topic,
Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(topic).with("*.orange.*");
} @Bean
public Binding binding1b(TopicExchange topic,
Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(topic).with("*.*.rabbit");
} @Bean
public Binding binding2a(TopicExchange topic,
Queue autoDeleteQueue2) {
return BindingBuilder.bind(autoDeleteQueue2).to(topic).with("lazy.#");
} }

Producer

@Component
@EnableAsync
public class SenderTask { private static final Logger logger = LoggerFactory.getLogger(SenderTask.class); @Autowired
private RabbitTemplate rabbitTemplate; @Autowired
private TopicExchange topicExchange; private final String[] keys = {"quick.orange.rabbit", "lazy.orange.elephant", "quick.orange.fox",
"lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"}; @Async
@Scheduled(cron = "0/1 * * * * ? ")
public void send(){ Random random = new Random(); String key = keys[random.nextInt(keys.length)]; String message = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ " to: " + key; rabbitTemplate.convertAndSend(topicExchange.getName(), key, message); logger.info(" [x] Sent '" + message + "'");
}
}

Consumer

@Component
public class ReceiverTask { private static final Logger logger = LoggerFactory.getLogger(ReceiverTask.class); @RabbitListener(queues = "#{autoDeleteQueue1.name}")
public void receive1(String in){
receive(in, 1);
} @RabbitListener(queues = "#{autoDeleteQueue2.name}")
public void receive2(String in){
receive(in, 2);
} public void receive(String in, int receiver){
logger.info("instance " + receiver + " [x] Received '" + in + "'");
}
}

完整代码:GitHub

Spring Boot + RabbitMQ 使用示例的更多相关文章

  1. Spring boot+RabbitMQ环境

    Spring boot+RabbitMQ环境 消息队列在目前分布式系统下具备非常重要的地位,如下的场景是比较适合消息队列的: 跨系统的调用,异步性质的调用最佳. 高并发问题,利用队列串行特点. 订阅模 ...

  2. spring boot Rabbitmq集成,延时消息队列实现

    本篇主要记录Spring boot 集成Rabbitmq,分为两部分, 第一部分为创建普通消息队列, 第二部分为延时消息队列实现: spring boot提供对mq消息队列支持amqp相关包,引入即可 ...

  3. 从头开始搭建一个Spring boot+RabbitMQ环境

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. spring boot 入门及示例

    需要环境:eclipse4.7.3 + jdk1.8 +maven3.6.1 + tomcat(web需要) spring boot官网介绍:https://spring.io/guides/gs/s ...

  5. Spring Boot Jersey使用示例

    前言 本文将学习如何使用Spring Boot和Jersey框架,去配置和创建JAX-RS 2.0 REST API接口: 这个示例应用使用的是Jersey的Servlet容器去部署REST API接 ...

  6. spring boot +RabbitMQ +InfluxDB+Grafara监控实践

    本文需要有相关spring boot 或spring cloud 相关微服务框架的基础,如果您具备相关基础可以很容易的实现下述过程!!!!!!! 希望本文的所说对需要的您有所帮助 从这里我们开始进入闲 ...

  7. spring boot rabbitmq 多MQ配置 自动 创建 队列 RPC

      源码地址:https://github.com/hutuchong518/RabbitmqStudy 需求:   spring boot 整合 rabbitmq rpc功能, 需要将 请求和响应 ...

  8. Spring Boot RabbitMQ 延迟消息实现完整版

    概述 曾经去网易面试的时候,面试官问了我一个问题,说 下完订单后,如果用户未支付,需要取消订单,可以怎么做 我当时的回答是,用定时任务扫描DB表即可.面试官不是很满意,提出: 用定时任务无法做到准实时 ...

  9. Spring Boot + RabbitMQ 配置参数解释

    最近生产RabbitMQ出了几次问题,所以抽时间整理了一份关于Spring Boot 整合RabbitMQ环境下的配置参数解释,通过官网文档和网上其他朋友一些文章参考归纳整理而得,有错误之处还请指正~ ...

随机推荐

  1. 别走!这里有个笔记:图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)

    前言 AbstractQueuedSynchronizer 抽象队列同步器,简称 AQS .是在 JUC 包下面一个非常重要的基础组件,JUC 包下面的并发锁 ReentrantLock CountD ...

  2. 【原创】ARM平台内存和cache对xenomai实时性的影响

    目录 1. 问题概述 2. stress 内存压力原理 2. cache 因素 2.1 未加压 2.2 加压(cpu/io) 3. 内存管理因素 3.1 内存分配/释放 3.2 MMU拥塞 4 总结 ...

  3. leetcode 38:path-sum

    题目描述 给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径, 例如: 给出如下的二叉树,sum=22,              5              / ...

  4. Core WebApi项目快速入门(三):踩坑笔记

    目前做公司一个项目,遇到了一些坑.跟大家分享,避免再次采坑. 1. 服务端发布应用报错 在windows server上发布程序报错.系统缺少更新包. https://support.microsof ...

  5. 10before_request钩子函数

    1,什么是钩子函数? 就是运行别人前都得先运行他: from flask import Flask app = Flask(__name__) @app.route('/') def hello_wo ...

  6. Pandas_工资集处理

    import numpy as np import pandas as pd from pandas import Series,DataFrame # 1--读取数据文件 file_obj=open ...

  7. notepad++覆盖了eclipse的快捷键

    好长时间发现eclipse快捷键alt+/无法使用,今天决定解决一下 1.Windows Hotkey Explorer 用此工具找到是notepad++占用了快捷键 2.C:\Program Fil ...

  8. ubuntu 文件编码格式 转换

    正在学习jquery,之前在windows下弄的编码到了 ubuntu下,乱码: 找到一个方法: iconv : 源文件:a.htm 格式:gbk: 目标:    a.html 格式:utf8: ic ...

  9. Java—多线程

    一.多线程 原理: 一个cpu内核有"一个指针",由于cpu的频率过高,所以感觉不到卡顿.(伪线程) 二.进程&线程 进程:进程指正在运行的程序.确切的来说,当一个程序进入 ...

  10. 04 . Vue组件注册,数据交互,调试工具及组件插槽介绍及使用

    vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...