欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
    }
    }
相关标签: spingBoot RabbitMQ