1 新建springboot项目引入依赖
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring-boot-rabbitmq</groupId>
<artifactId>spring-boot-rabbitmq</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.0</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
2 交换机配置
2.1 direc交换机
package boot.spring.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//direct直连模式的交换机配置,包括一个direct交换机,两个队列,三根网线binding
@Configuration
public class DirectExchangeConfig {
@Bean
public DirectExchange directExchange(){
DirectExchange directExchange=new DirectExchange("direct");
return directExchange;
}
@Bean
public Queue directQueue1() {
Queue queue=new Queue("directqueue1");
return queue;
}
@Bean
public Queue directQueue2() {
Queue queue=new Queue("directqueue2");
return queue;
}
//3个binding将交换机和相应队列连起来
@Bean
public Binding bindingorange(){
Binding binding=BindingBuilder.bind(directQueue1()).to(directExchange()).with("orange");
return binding;
}
@Bean
public Binding bindingblack(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("black");
return binding;
}
@Bean
public Binding bindinggreen(){
Binding binding=BindingBuilder.bind(directQueue2()).to(directExchange()).with("green");
return binding;
}
}
2.2 fanout交换机
package boot.spring.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//发布订阅模式的配置,包括两个队列和对应的订阅者,发布者的交换机类型使用fanout(子网广播),两根网线binding用来绑定队列到交换机
@Configuration
public class FanoutExchangeConfig {
@Bean
public Queue myQueue1() {
Queue queue=new Queue("queue1");
return queue;
}
@Bean
public Queue myQueue2() {
Queue queue=new Queue("queue2");
return queue;
}
@Bean
public FanoutExchange fanoutExchange(){
FanoutExchange fanoutExchange=new FanoutExchange("fanout");
return fanoutExchange;
}
@Bean
public Binding binding1(){
Binding binding=BindingBuilder.bind(myQueue1()).to(fanoutExchange());
return binding;
}
@Bean
public Binding binding2(){
Binding binding=BindingBuilder.bind(myQueue2()).to(fanoutExchange());
return binding;
}
}
2.3 topic交换机
package boot.spring.config;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//topic交换机模型,需要一个topic交换机,两个队列和三个binding
@Configuration
public class TopicExchangeConfig {
@Bean
public TopicExchange topicExchange(){
TopicExchange topicExchange=new TopicExchange("topic");
return topicExchange;
}
@Bean
public Queue topicQueue1() {
Queue queue=new Queue("topicqueue1");
return queue;
}
@Bean
public Queue topicQueue2() {
Queue queue=new Queue("topicqueue2");
return queue;
}
//3个binding将交换机和相应队列连起来
@Bean
public Binding bindingtopic1(){
Binding binding=BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("*.orange.*");//binding key
return binding;
}
@Bean
public Binding bindingtopic2(){
Binding binding=BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("*.*.rabbit");
return binding;
}
@Bean
public Binding bindingtopic3(){
Binding binding=BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("lazy.#");//#表示0个或若干个关键字,*表示一个关键字
return binding;
}
}
3 队列监听
3.1 direc交换机的队列
package boot.spring.rabbitMQ.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import boot.spring.po.Mail;
@Component
public class DirectListener {
@RabbitListener(queues = "directqueue1")
public void displayMail1(Mail mail) throws Exception {
System.out.println("directqueue1队列监听器1号收到消息"+mail.toString());
}
@RabbitListener(queues = "directqueue2")
public void displayMail2(Mail mail) throws Exception {
System.out.println("directqueue2队列监听器2号收到消息"+mail.toString());
}
}
3.2 fanout交换机的队列
package boot.spring.rabbitMQ.listener;
import java.io.IOException;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import boot.spring.po.Mail;
@Component
public class FanoutListener {
@RabbitListener(queues = "queue1")
public void subscribe1(Mail mail) throws IOException {
System.out.println("订阅者1收到消息"+mail.toString());
}
@RabbitListener(queues = "queue2")
public void subscribe2(Mail mail) throws IOException {
System.out.println("订阅者2收到消息"+mail.toString());
}
}
3.3 topic交换机队列
package boot.spring.rabbitMQ.listener;
import java.io.IOException;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import boot.spring.po.Mail;
@Component
public class TopicListener {
@RabbitListener(queues = "topicqueue1")
public void displayTopic1(Mail mail) throws IOException {
System.out.println("从topicqueue1取出消息"+mail.toString());
}
@RabbitListener(queues = "topicqueue2")
public void displayTopic2(Mail mail) throws IOException {
System.out.println("从topicqueue2取出消息"+mail.toString());
}
}
4 发送消息
4.1 发送消息
package boot.spring.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import boot.spring.po.Mail;
import boot.spring.po.TopicMail;
import boot.spring.service.impl.ProducerImpl;
import boot.spring.service.impl.PublisherImpl;
@Controller
public class RabbitMQController {
@Autowired
PublisherImpl publisher;
//广播模式
@RequestMapping(value="/fanout",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public void topic(@ModelAttribute("mail")Mail mail) throws Exception{
publisher.sendfanoutMail(mail);
}
@RequestMapping(value="/direct",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public void direct(@ModelAttribute("mail")TopicMail mail){
Mail m=new Mail(mail.getMailId(),mail.getCountry(),mail.getWeight());
publisher.senddirectMail(m, mail.getRoutingkey());
}
//模式
@RequestMapping(value="/topic",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public void topic(@ModelAttribute("mail")TopicMail mail){
Mail m=new Mail(mail.getMailId(),mail.getCountry(),mail.getWeight());
publisher.sendtopicMail(m, mail.getRoutingkey());
}
}
4.2 发送消息接口
package boot.spring.service;
import boot.spring.po.Mail;
public interface Publisher {
public void sendfanoutMail(Mail mail);//使用fanout交换机发布消息给所有队列
public void senddirectMail(Mail mail,String routingkey);//使用direct交换机发送消息
public void sendtopicMail(Mail mail,String routingkey);//使用topic交换机发送消息
}
4.3发送消息接口实现
package boot.spring.service.impl;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import boot.spring.po.Mail;
import boot.spring.service.Publisher;
@Service("publisher")
public class PublisherImpl implements Publisher{
@Autowired
RabbitTemplate rabbitTemplate;
public void sendfanoutMail(Mail mail) {
rabbitTemplate.convertAndSend("fanout", "", mail);
}
public void senddirectMail(Mail mail, String routingkey) {
rabbitTemplate.convertAndSend("direct", routingkey, mail);
}
public void sendtopicMail(Mail mail, String routingkey) {
rabbitTemplate.convertAndSend("topic", routingkey, mail);
}
}
5 实体类
5.1 Mail
package boot.spring.po;
import java.io.Serializable;
public class Mail implements Serializable{
private static final long serialVersionUID = -8140693840257585779L;
private String mailId;
private String country;
private Double weight;
public Mail() {
}
public Mail(String mailId, String country, double weight) {
this.mailId = mailId;
this.country = country;
this.weight = weight;
}
public String getMailId() {
return mailId;
}
public void setMailId(String mailId) {
this.mailId = mailId;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Mail [mailId=" + mailId + ", country=" + country + ", weight="
+ weight + "]";
}
}
5.2 TopicMail
package boot.spring.po;
public class TopicMail extends Mail{
String routingkey;
public String getRoutingkey() {
return routingkey;
}
public void setRoutingkey(String routingkey) {
this.routingkey = routingkey;
}
@Override
public String toString() {
return "TopicMail [routingkey=" + routingkey + "]";
}
}
6 源码
https://gitee.com/magic_sea_right_demon/springboot-rabbit-mq.git