springBoot+RabbitMQ简单例子
程序员文章站
2022-07-05 21:30:03
...
今天看了一下微服务的RabbitMQ 消息处理, 就写了一个例子,记录踩的坑 RabbitMQ安装就不介绍了,之前服务器安装过,
新建一个Spring Boot工程,命名为:“rabbitmq-hello”。
在pom.xml中引入如下依赖内容,其中spring-boot-starter-amqp用于支持RabbitMQ。
因为我建项目直接是官网建的,RabbitMQ依赖直接加上就OK,下载ZIP解压后导入工程,IDE里建也是一样。
直接上代码了,pom.xml依赖文件里 加入amqp依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringBootRabbitMQ</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在application.properties中配置关于RabbitMQ的连接和用户信息,用户可以回到上面的安装内容,在管理页面中创建用户。
spring.rabbitmq.host=192.168.11.12
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
安装rabbitmq的时候,这些消息写上
然后就是开始写类 一共五个类,一个springboot启动类,一个测试类,一个发送类,一个接收者类,一个配置消息类,
启动类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqHelloTest {
@Autowired
private Sender senders;
@Test
public void hello() throws Exception {
senders.send();
}
}
创建消息生产者Sender。通过注入AmqpTemplate接口的实例来实现消息的发送,AmqpTemplate接口定义了一套针对AMQP协议的基础操作。在Spring Boot中会根据配置来注入其具体实现。在该生产者,我们会产生一个字符串,并发送到名为hello_lmctest的队列中。
消息发送类,之前注入一直不成功,后台报空值,@Component这个之前没加上,注入类型这个是必须项,找了好一会儿原因
//消息发送者
@Component
public class Sender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(){
String context = "hello world lmc " + new Date();
System.out.println("Sender : " + context);
this.amqpTemplate.convertAndSend("hello_lmctest",context);
}
}
然后是消息接收类了,也很简单,之前测试的时候,发送消息时,队列名称没写,直接发送消息,无法接收请求,都是太大意了, 其实都简单
创建消息消费者Receiver。通过@RabbitListener注解定义该类对hello队列的监听,并用@RabbitHandler注解来指定对消息的处理方法。所以,该消费者实现了对hello队列的消费,消费操作为输出消息的字符串内容。
//消息接收者
@Component
@RabbitListener(queues="hello_lmctest")
public class HelloReceiver {
@RabbitHandler
public void process(String str){
System.out.println("Receiver "+str);
}
}
创建RabbitMQ的配置类RabbitConfig,用来配置队列、交换器、路由等高级信息。这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
配置类比较简单,生成一个队列,这个队列就是发送者和接收者都 需要对应的,监听队列
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue(){
return new Queue("hello_lmctest");
}
}
最后在 RabbitMQ 服务器端可以 访问RabbitMQ UI界面,查得到queues 创建的hello_lmctest队列名
启动应用主类,从控制台中,我们看到如下内容,程序创建了一个访问127.0.0.1:5672中springcloud的连接。
[cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#7b94089b:0/SimpleConnection@2145fe53
消息没有复制全,后面跟关IP 还有一些信息
再运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了RabbitMQ Server的hello_lmctest队列中。
Sender : hello world lmc Thu May 24 14:04:49 CST 2018
切换到应用主类的控制台,我们可以看到类似如下输出,消费者对hello_lmctest队列的监听程序执行了,并输出了接受到的消息信息。
Receiver hello world lmc Thu May 24 14:04:49 CST 2018
这是简单应用,然而在实际应用中,我们还有很多内容没有演示 有交换机,路由健,模板等更高级的使用方式,有时间再研究
测试发送对象消息的时候,对实体类必须 序列化,实现public class User implements Serializable 接口
@Test
public void hello() throws Exception {
//消息发送对象类型,一定要序列化才行
User user=new User();
user.setId("1243");
user.setName("lmc");
System.out.println("user");
for(int i=0;i<6;i++){
senderobj.send(user);
}
}
新建一个Spring Boot工程,命名为:“rabbitmq-hello”。
在pom.xml中引入如下依赖内容,其中spring-boot-starter-amqp用于支持RabbitMQ。
因为我建项目直接是官网建的,RabbitMQ依赖直接加上就OK,下载ZIP解压后导入工程,IDE里建也是一样。
直接上代码了,pom.xml依赖文件里 加入amqp依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringBootRabbitMQ</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在application.properties中配置关于RabbitMQ的连接和用户信息,用户可以回到上面的安装内容,在管理页面中创建用户。
spring.rabbitmq.host=192.168.11.12
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
安装rabbitmq的时候,这些消息写上
然后就是开始写类 一共五个类,一个springboot启动类,一个测试类,一个发送类,一个接收者类,一个配置消息类,
启动类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqHelloTest {
@Autowired
private Sender senders;
@Test
public void hello() throws Exception {
senders.send();
}
}
创建消息生产者Sender。通过注入AmqpTemplate接口的实例来实现消息的发送,AmqpTemplate接口定义了一套针对AMQP协议的基础操作。在Spring Boot中会根据配置来注入其具体实现。在该生产者,我们会产生一个字符串,并发送到名为hello_lmctest的队列中。
消息发送类,之前注入一直不成功,后台报空值,@Component这个之前没加上,注入类型这个是必须项,找了好一会儿原因
//消息发送者
@Component
public class Sender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(){
String context = "hello world lmc " + new Date();
System.out.println("Sender : " + context);
this.amqpTemplate.convertAndSend("hello_lmctest",context);
}
}
然后是消息接收类了,也很简单,之前测试的时候,发送消息时,队列名称没写,直接发送消息,无法接收请求,都是太大意了, 其实都简单
创建消息消费者Receiver。通过@RabbitListener注解定义该类对hello队列的监听,并用@RabbitHandler注解来指定对消息的处理方法。所以,该消费者实现了对hello队列的消费,消费操作为输出消息的字符串内容。
//消息接收者
@Component
@RabbitListener(queues="hello_lmctest")
public class HelloReceiver {
@RabbitHandler
public void process(String str){
System.out.println("Receiver "+str);
}
}
创建RabbitMQ的配置类RabbitConfig,用来配置队列、交换器、路由等高级信息。这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
配置类比较简单,生成一个队列,这个队列就是发送者和接收者都 需要对应的,监听队列
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue(){
return new Queue("hello_lmctest");
}
}
最后在 RabbitMQ 服务器端可以 访问RabbitMQ UI界面,查得到queues 创建的hello_lmctest队列名
启动应用主类,从控制台中,我们看到如下内容,程序创建了一个访问127.0.0.1:5672中springcloud的连接。
[cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#7b94089b:0/SimpleConnection@2145fe53
消息没有复制全,后面跟关IP 还有一些信息
再运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了RabbitMQ Server的hello_lmctest队列中。
Sender : hello world lmc Thu May 24 14:04:49 CST 2018
切换到应用主类的控制台,我们可以看到类似如下输出,消费者对hello_lmctest队列的监听程序执行了,并输出了接受到的消息信息。
Receiver hello world lmc Thu May 24 14:04:49 CST 2018
这是简单应用,然而在实际应用中,我们还有很多内容没有演示 有交换机,路由健,模板等更高级的使用方式,有时间再研究
测试发送对象消息的时候,对实体类必须 序列化,实现public class User implements Serializable 接口
@Test
public void hello() throws Exception {
//消息发送对象类型,一定要序列化才行
User user=new User();
user.setId("1243");
user.setName("lmc");
System.out.println("user");
for(int i=0;i<6;i++){
senderobj.send(user);
}
}
上一篇: 几句良言 胜过十年代码