目录
声明:本系列代码均通过测试,可放心使用
一、基础配置
1.新建项目,引入依赖
创建好后,查看一下pom.xml:
按照我们的方法,rabbitmq已经集成了。
<?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.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xupeng</groupId>
<artifactId>rabbitmq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbitmq</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--rabbitmq已经集成在这个依赖里了-->
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.编辑配置文件
spring:
application:
name: rabbitmq-springboot
rabbitmq:
host: 192.168.210.137
port: 5672
username: ems
password: ems
virtual-host: /ems
二、helloworld模式
HelloConsumer:
package com.xupeng.rabbitmq.hello;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 14:40]
*/
@Component
//默认持久化,非独占,非自动删除队列
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",autoDelete = "false"))
public class HelloConsumer {
@RabbitHandler
private void receive(String message){
System.out.println("message:"+message);
}
}
RabbitmqApplicationTests:
package com.xupeng.rabbitmq;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = RabbitmqApplication.class)
@RunWith(SpringRunner.class)
public class RabbitmqApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
//helloworld
@Test
public void test(){
//参数一:队列名
//参数二:队列内容
rabbitTemplate.convertAndSend("hello","hello world");
}
}
三、workqueue模式公平消费
WorkConsumer:
package com.xupeng.rabbitmq.work;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:08]
*/
@Component
public class WorkConsumer {
@RabbitListener(queuesToDeclare = @Queue("work"))
// @Queue(value = "hello",durable = "true",autoDelete = "false")
public void receive1(String message){
System.out.println("message1:"+message);
}
@RabbitListener(queuesToDeclare = @Queue("work"))
public void receive2(String message){
System.out.println("message2:"+message);
}
}
WorkQueueTest:
package com.xupeng.rabbitmq.test;
import com.xupeng.rabbitmq.RabbitmqApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:06]
*/
@SpringBootTest(classes = RabbitmqApplication.class)
@RunWith(SpringRunner.class)
public class WorkQueueTest {
@Autowired
private RabbitTemplate rabbitTemplate;
//workqueue
@Test
public void test(){
//参数一:队列名
//参数二:队列内容
for(int i = 0;i<10;i++) {
rabbitTemplate.convertAndSend("work", "work模型"+i);
}
}
}
四、发布订阅(广播)模型
FanoutTest:
package com.xupeng.rabbitmq.test;
import com.xupeng.rabbitmq.RabbitmqApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:06]
*/
@SpringBootTest(classes = RabbitmqApplication.class)
@RunWith(SpringRunner.class)
public class FanoutTest {
@Autowired
private RabbitTemplate rabbitTemplate;
//Fanout
@Test
public void test(){
//参数一:交换机名
//参数二:routingKey
//参数三:内容
rabbitTemplate.convertAndSend("logs","", "fanout模型");
}
}
FanoutConsumer:
package com.xupeng.rabbitmq.fanout;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:16]
*/
@Component
public class FanoutConsumer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "logs",type = "fanout")
))
public void receive1(String message){
System.out.println("message1:"+message);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "logs",type = "fanout")
))
public void receive2(String message){
System.out.println("message2:"+message);
}
}
五、Direct直接路由模型
DirectRoutingTest:
package com.xupeng.rabbitmq.test;
import com.xupeng.rabbitmq.RabbitmqApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:06]
*/
@SpringBootTest(classes = RabbitmqApplication.class)
@RunWith(SpringRunner.class)
public class DirectRoutingTest {
@Autowired
private RabbitTemplate rabbitTemplate;
//DirectRouting
@Test
public void test(){
//参数一:交换机名
//参数二:routingKey
//参数三:内容
rabbitTemplate.convertAndSend("directs","error", "DirectRouting模型");
}
}
DirectRoutingConsumer:
package com.xupeng.rabbitmq.directRouting;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:24]
*/
@Component
public class DirectRoutingConsumer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "directs", type = "direct"),//自定义交换机名称和类型
key = {"info","error","warning"}
))
public void receive1(String message) {
System.out.println("message1:" + message);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "directs", type = "direct"),//自定义交换机名称和类型
key = {"info"}
))
public void receive2(String message){
System.out.println("message2:"+message);
}
}
六、Topic动态路由模型
TopicRoutingTest:
package com.xupeng.rabbitmq.test;
import com.xupeng.rabbitmq.RabbitmqApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:06]
*/
@SpringBootTest(classes = RabbitmqApplication.class)
@RunWith(SpringRunner.class)
public class TopicRoutingTest {
@Autowired
private RabbitTemplate rabbitTemplate;
//TopicRouting
@Test
public void test(){
//参数一:交换机名
//参数二:routingKey
//参数三:内容
rabbitTemplate.convertAndSend("topics","user.save.list", "TopicRouting模型");
}
}
TopicRoutingConsumer:
package com.xupeng.rabbitmq.topicRouting;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* [一句话描述该类的功能]
*
* @author : [xupeng]
* @version : [v1.0]
* @createTime : [2021/7/7 15:33]
*/
@Component
public class TopicRoutingConsumer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "topics", type = "topic"),//自定义交换机名称和类型
key = {"user.*"}
))
public void receive1(String message) {
System.out.println("message1:" + message);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue,//临时队列
exchange = @Exchange(value = "topics", type = "topic"),//自定义交换机名称和类型
key = {"user.#","product.#"}
))
public void receive2(String message){
System.out.println("message2:"+message);
}
}
七、MQ应用场景说明
1.异步处理
用户注册成功后,发送短信和邮件。其中邮件和短信可以通过mq处理,注册走主流程。不需要等待短信和邮件的完成
2.应用解耦
订单系统和库存系统通过mq交互,不会因为一个系统错误导致另一个系统走不下去
3.流量削峰
电商网站双十一0秒秒杀的时候,流量发请求时先发到消息队列,再去主业务。并且消息队列设置请求数量阈值,超过了后面的就丢弃。
八、打赏请求
如果本篇博客对您有所帮助,打赏一点呗,谢谢了呢~