消息中间件对于我们系统之间的解耦合,消峰等都有极大的帮助。spring boot 也集成了此部分的内容,集成最为容易的是rabbitmq。今天我们就以rabbitmq为例说明。
老规矩,先看下pom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter</ artifactId >
</ dependency >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-web</ artifactId >
</ dependency >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-amqp</ artifactId >
</ dependency >
< dependency >
< groupId >org.projectlombok</ groupId >
< artifactId >lombok</ artifactId >
</ dependency >
|
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制,spring-boot-starter-amqp引入的就是rabbitmq。有个前提,你的机子上要首先先安装rabbitmq的server,然后执行 rabbitmq-server server就启动了。启动后,我们就可以配置我们的客户端程序了。首先看下我们的配置文件
1
2
3
4
5
6
|
spring.application.name: spirng-boot-rabbitmq
spring.rabbitmq.host: 127.0.0.1
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
|
配置了服务器的IP,端口,用户名,密码等基础信息,保证我们能连上服务器。
增加一个Rabbitmq的配置类
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.shuqi;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue Queue() {
return new Queue( "hello" );
}
}
|
创建了一个名称叫做hello的队列,然后producer可以往hello的队列里放数据,consumer可以从hello的队列里消费数据。看下producer的处理程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.shuqi.controller;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private AmqpTemplate rabbitTemplate;
@RequestMapping ( "/hello" )
public String hello( @RequestParam String name){
rabbitTemplate.convertAndSend( "hello" , "hello " +name);
return "消息发送成功" ;
}
}
|
通过controller生产消息,通过AmqpTemplate发送消息。有了生产者我们看下消费者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.shuqi.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener (queues = "hello" )
@Slf4j
public class HelloConsumer {
@RabbitHandler
public void process(String hello) {
log.info( "接收到的消息:message:{}" ,hello);
}
}
|
@RabbitListener(queues = "hello") 表示是一个Rabbitmq的监听器,监听的队列名称是hello,说明数据可定会过来,数据过来了,通过 @RabbitHandler 修饰的方法来处理过来的数据。打印一下。下面我们启动项目看看效果。
在浏览器中输入 http://localhost:8080/hello?name=shuqi 看到下面的结果
看下控制台输出的日志
2018-03-25 16:24:32.752 INFO 4987 --- [cTaskExecutor-1] com.shuqi.consumer.HelloConsumer : 接收到的消息:message:hello shuqi
说明消息已经被consumer接收并处理掉了。大家可以把玩下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.jianshu.com/p/f9d1466681d4