pom文件都是相同的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>spring-boot-direct-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-direct-consumer</name>
<description>spring-boot-direct-consumer</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

Direct 交换器(发布与订阅 完全匹配)

需求

修改 Consumer 的配置文件
server.port=8081
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111 #设置交换器的名称
mq.config.exchange=log.direct #设置info队列名称
mq.config.queue.info=log.info #设置info的路由键
mq.config.queue.info.routing.key=log.info.routing.key #设置error队列名称
mq.config.queue.error=log.error #设置error的路由键
mq.config.queue.error.routing.key=log.error.routing.key
修改 Provider 的配置文件
server.port=8080
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111 #设置交换器的名称
mq.config.exchange=log.direct #设置info的路由键
mq.config.queue.info.routing.key=log.info.routing.key #设置error队列名称
mq.config.queue.error=log.error #设置error的路由键
mq.config.queue.error.routing.key=log.error.routing.key
 
编写 Consumer
 
InfoReceiver
package com.bjsxt.receive;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component; /***
* 消息的接收者
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.info}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.DIRECT),
key="${mq.config.queue.info.routing.key}"
)
)
public class InfoReceiver { /**
* 接收消息的方法
* 采用消息队列监听机制
* @param msg
*/
@RabbitHandler
public void process(String msg){
System.out.println("info--receiver=:"+msg);
}
}
 
ErrorReceiver
 
package com.bjsxt.receive;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component; /***
* 消息的接收者
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.error}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.DIRECT),
key="${mq.config.queue.error.routing.key}"
)
)
public class ErrorReceiver { /**
* 接收消息的方法
* 采用消息队列监听机制
* @param msg
*/
@RabbitHandler
public void process(String msg){
System.out.println("Error--receiver=:"+msg);
}
}
 
编写 Provider
 
Sender
package com.bjsxt.send;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* 消息发送者
*/
@Component
public class Sender { @Autowired
private AmqpTemplate amqpTemplate; @Value("${mq.config.exchange}")
private String exchange; @Value("${mq.config.queue.error.routing.key}")
private String routingkey; /**
* 发送消息的方法
* @param msg
*/
public void sendMsg(String msg){
/*向消息队列发送消息*/
/*
* 参数一:队列的名称
* 参数二:发送的消息
* */
amqpTemplate.convertAndSend(exchange,routingkey,msg); }
}
com.bjsxt.test.RabbitMQTest
package com.bjsxt.test;

import com.bjsxt.SpringBootDirectProviderApplication;
import com.bjsxt.send.Sender;
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.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringBootDirectProviderApplication.class)
public class RabbitMQTest { @Autowired
private Sender sender; @Test
public void queueTest() throws InterruptedException {
while (true){
Thread.sleep(1000);
sender.sendMsg("你好RabbitMQ");
}
}
}
 
 
Topic 交换器(主题,规则匹配)
 
 
需求
 
 
 
 
 
 
 
 
 
Consumer
 
server.port=8083
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111 #设置交换器的名称
mq.config.exchange=log.topic #设置info队列名称
mq.config.queue.info=log.info #设置info队列名称
mq.config.queue.error=log.error #log 队列名称
mq.config.queue.logs=log.all
 
Provider
server.port=8084
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111 #设置交换器的名称
mq.config.exchange=log.topic
编写 Provider
 
 
UserSender (OrderSender以及ProduceSender三者类似)
 
package com.bjsxt.send;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* 消息发送者
*/
@Component
public class UserSender { @Autowired
private AmqpTemplate amqpTemplate; @Value("${mq.config.exchange}")
private String exchange; /**
* 发送消息的方法
* @param msg
*/
public void sendMsg(String msg){
/*向消息队列发送消息*/
/*
* 参数一:队列的名称
* 参数二:发送的消息
* */
amqpTemplate.convertAndSend(exchange,"user.log.bug", "user.log.debug....."+msg);
amqpTemplate.convertAndSend(exchange,"user.log.info", "user.log.info....."+msg);
amqpTemplate.convertAndSend(exchange,"user.log.warn", "user.log.warn....."+msg);
amqpTemplate.convertAndSend(exchange,"user.log.error", "user.log.error....."+msg); }
}
 
编写 Consumer
 
InfoReceiver
package com.bjsxt.receive;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component; /***
* 消息的接收者
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.info}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.TOPIC),
key="*.log.info"
)
)
public class InfoReceiver { /**
* 接收消息的方法
* 采用消息队列监听机制
* @param msg
*/
@RabbitHandler
public void process(String msg){
System.out.println("info--receiver=:"+msg);
}
}
LogReceiver
package com.bjsxt.receive;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component; /***
* 消息的接收者
*/
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.logs}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.TOPIC),
key="*.log.*"
)
)
public class LogReceiver { /**
* 接收消息的方法
* 采用消息队列监听机制
* @param msg
*/
@RabbitHandler
public void process(String msg){
System.out.println("log--receiver=:"+msg);
}
}
 
Fanout 交换器(广播)
 
 
 
 
 
 
 
 
 
Consumer
 
spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#设置交换器的名称
mq.config.exchange=order.fanout
#短信服务队列名称
mq.config.queue.sms=order.sms
#push 服务队列名称
mq.config.queue.push=order.push
Provider
spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.181.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=111111
#设置交换器的名称
mq.config.exchange=order.fanout
接收方的不停之处在于没有了key其他都是一样的,然后exchange类型换成fanout
 
发送方
rabbitAmqpTemplate.convertAndSend(this.exchange,"", msg);
 
 
 

RabbitMQ的三大交换器的更多相关文章

  1. SpringBoot应用操作Rabbitmq(topic交换器高级操作)

    一.topic交换器为主题交换器,可以根据路由key模糊匹配 实现模型图 二.实战 1.引入maven <dependency> <groupId>org.springfram ...

  2. RabbitMQ中声明交换器,队列时的,autoDelete=true自动删除的条件

    在声明交换器和队列时,有一个属性叫autoDelete,表示是否自动删除. 如果autoDelete=true,表示自动删除.此处我们要理解,自动删除的条件是什么? 这里的关键是,自动删除的条件是向后 ...

  3. RabbitMQ之Fanout交换器模式开发

    Fanout模式,即广播模式,一个发送到交换机的消息会被转发到与该交换机绑定的所有队列上. 一.Provider 配置文件 spring.application.name=provider sprin ...

  4. RabbitMQ之Topic交换器模式开发

    Topic交换器,即主题模式,进行规则匹配. 一.Provider 配置文件 spring.application.name=provider spring.rabbitmq.host=192.168 ...

  5. RabbitMQ之Direct交换器模式开发

    Dirtct交换器,即发布与订阅模式,匹配规则为完全匹配. 一.Provideer 配置文件 spring.application.name=provider spring.rabbitmq.host ...

  6. Rabbitmq交换器Exchange和消息队列

    通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...

  7. RabbitMQ指南之五:主题交换器(Topic Exchange)

    在上一章中,我们完善了我们的日志系统,用direct交换器替换了fanout交换器,使得我们可以有选择性地接收消息.尽管如此,仍然还有限制:不能基于多个标准进行路由.在我们的日志系统中,我们可能不仅希 ...

  8. RabbitMQ交换器的类型

    RabbitMQ常用的交换器类型有:fanout,direct,topic,headers fanout它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中. direct它会把消息路由到哪 ...

  9. RabbitMQ基础教程

    目录 RabbitMQ相关概念介绍 生产者和消费者 队列 交换器.路由键.绑定 交换器类型 RabbitMQ运转流程 AMQP协议介绍 AMQP生产者流转过程 AMQP消费者流转过程 安装Rabbit ...

随机推荐

  1. .net core Json字符串的序列化和反序列化通用类源码,并模拟了10万数据对比DataContractJsonSerializer和Newtonsoft性能

    我们在开发中Json传输数据日益普遍,有很多关于Json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效.因为有太多选择,人们往往会陷入选择难题. 相比.NET Fram ...

  2. day7-format字符串格式化

    tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18) print ...

  3. 深入理解计算机系统 第八章 异常控制流 Part2 第二遍

    第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 508~530 页,共 23 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/10206 ...

  4. 安装&卸载Windows服务

    使用.NET Framework的工具InstallUtil.exe. 安装服务 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.e ...

  5. Salesforce学习之路(十)Org的命名空间

    1. 命名空间的适用场景 每个组件都是命名空间的一部分,如果Org中设置了命名空间前缀,那么需使用该命名空间访问组件.否则,使用默认命名空间访问组件,系统默认的命名空间为“c”. 如果Org没有创建命 ...

  6. jQuery简单面试题

    干货 | jQuery经典面试题及答案精选 面试题来啦! 毫无疑问,JavaScript是一门如此有用,但总是被低估的一门语言. 在 jQuery 粉墨登场之前,我们曾经会写出冗长的JavaScrip ...

  7. 扛把子组20191010-1 Alpha阶段贡献分配规则

    此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8744] 队名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 ...

  8. 程序员用于机器学习编程的Python 数据处理库 pandas 入门教程

    入门介绍 pandas适合于许多不同类型的数据,包括: · 具有异构类型列的表格数据,例如SQL表格或Excel数据 · 有序和无序(不一定是固定频率)时间序列数据. · 具有行列标签的任意矩阵数据( ...

  9. 《手把手教你》系列练习篇之2-python+ selenium自动化测试(详细教程)

    1. 简介 今天我们还是继续练习练习基本功,各位小伙伴要耐住住性子,要耐得住寂寞啊,不要急躁,后面你会感谢你在前边的不断练习的.到后面也是检验你前边的学习成果的一次很好实践. 本文介绍如何通过link ...

  10. Linux高级命令-sort、uniq、 cut、sed、grep、find、awk

    sort(参考学习网站:http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html) 功能:根据不同的数据类型进行排序 格式:s ...