配置文件
application.yml
demo:
rabbit:
address: 192.168.0.188:5672
virtual-host: /demo
username: demo
password: "123456"
server:
port: 1852
servlet:
context-path: /rmq
pom.xml文件
<?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.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tricky.demo</groupId>
<artifactId>rabbit-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbit-demo</name>
<description>Demo project for Spring Boot</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-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.7</version>
</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>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
RabbitMQ配置初始化
package com.tricky.demo.rabbit.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.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* mq配置
*
* @Autor Shadow 2020/10/23
* @Date 2020-10-23 14:12:19
*/
@Configuration
public class RabbitMQConfiguration {
@Value("${demo.rabbit.address}")
private String rabbitAddress;
@Value("${demo.rabbit.username}")
private String username;
@Value("${demo.rabbit.password}")
private String password;
@Value("${demo.rabbit.virtual-host}")
private String virtualHost;
//相当于<Bean id="connectionFactory"></Bean>
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(rabbitAddress);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
return connectionFactory;
}
//形参名称要与bean的方法名保持一致
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
@Bean
public TopicExchange demoExchange() {
return new TopicExchange(EnumRabbitQueue.Demo.getExchange(), true, false);
}
@Bean
public Queue demoQueue() {
return new Queue(EnumRabbitQueue.Demo.getName(), true); //队列持久
}
@Bean
public Binding demoBinding() {
return BindingBuilder.bind(demoQueue()).to(demoExchange()).with(EnumRabbitQueue.Demo.getRouteKey());
}
@Bean
public TopicExchange zmmExchange() {
return new TopicExchange(EnumRabbitQueue.Zmm.getExchange(), true, false);
}
@Bean
public Queue zmmQueue() {
return new Queue(EnumRabbitQueue.Zmm.getName(), true); //队列持久
}
@Bean
public Binding zmmBinding() {
return BindingBuilder.bind(zmmQueue()).to(zmmExchange()).with(EnumRabbitQueue.Zmm.getRouteKey());
}
}
package com.tricky.demo.rabbit.config;
/**
* mq-queue-name
*
* @Autor Shadow 2020/10/23
* @Date 2020-10-23 14:55:36
*/
public enum EnumRabbitQueue {
None("ex_none", "na_none", "key_none"),
Demo("ex_demo", "na_demo", "key_demo"),
Zmm("ex_zmm", "na_zmm", "key_zmm"),
//
;
private final String exchange;
private final String name;
private final String routeKey;
public String getExchange() {
return exchange;
}
public String getName() {
return name;
}
public String getRouteKey() {
return routeKey;
}
EnumRabbitQueue(String exchange, String name, String routeKey) {
this.exchange = exchange;
this.name = name;
this.routeKey = routeKey;
}
}
生成者产生ActiveMQ消息
package com.tricky.demo.rabbit.service;
import com.tricky.demo.rabbit.config.EnumRabbitQueue;
import com.tricky.demo.rabbit.msg.DemoDataMsg;
import com.tricky.demo.rabbit.msg.DemoNumberMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 测试
*
* @Autor Shadow 2020/10/23
* @Date 2020-10-23 14:36:50
*/
@Service
public class TestRabbitService {
private static Logger logger = LoggerFactory.getLogger(TestRabbitService.class);
@Autowired
private AmqpTemplate amqpTemplate;
/**
* 发送一个test消息
*
* @param dt
*/
public void sendData(String dt) {
DemoDataMsg msg = new DemoDataMsg();
msg.setData(dt);
amqpTemplate.convertAndSend(EnumRabbitQueue.Demo.getExchange(), EnumRabbitQueue.Demo.getRouteKey(), msg, (message) -> message);
}
/**
* 发送一个test消息
*
* @param dt
*/
public void sendNumber(String dt) {
DemoNumberMsg msg = new DemoNumberMsg();
msg.setNumber(Long.parseLong(dt));
amqpTemplate.convertAndSend(EnumRabbitQueue.Demo.getExchange(), EnumRabbitQueue.Demo.getRouteKey(), msg, (message) -> message);
}
}
消费RabbitMQ的数据
package com.tricky.demo.rabbit.handler;
import cn.hutool.json.JSONUtil;
import com.tricky.demo.rabbit.msg.DemoDataMsg;
import com.tricky.demo.rabbit.msg.DemoNumberMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* handler
*
* @Autor Shadow 2020/10/23
* @Date 2020-10-23 15:11:33
*/
@Component
@RabbitListener(queues = "na_demo")
public class DemoMessageHandler {
private static Logger logger = LoggerFactory.getLogger(DemoMessageHandler.class);
@RabbitHandler
public void handle(String data) {
logger.info(String.format("收到的消息为:%s", data));
}
@RabbitHandler
public void handle(DemoDataMsg data) {
logger.info(String.format("收到的消息为:%s %s", data.getClass().getName(), JSONUtil.toJsonStr(data)));
}
@RabbitHandler
public void handle(DemoNumberMsg data) {
logger.info(String.format("收到的消息为:%s %s", data.getClass().getName(), JSONUtil.toJsonStr(data)));
}
}
运行例子:
打开 http://localhost:1852/rmq
源代码:
链接:https://pan.baidu.com/s/1WjEMq8UjjKiK8cswmmeixg
提取码:abcd
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V4的分享