springBoot+RabbitMQ简单例子

下微服务的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); 
    } 
    }

初步涉及消息这块,后期还要努力研究更多原理

猜你喜欢

转载自blog.csdn.net/limingcai168/article/details/81214493