最近研究了很多关于SpringBoot的文章,它能和很多框架进行整合,尤其是中间件的整合,我们公司用的最多的就是整合redis了,但是我对rabbitMQ比较感兴趣,就想自己整合下玩玩,看了很多文章后,开始撸起袖子加油干。
- 以direct exchange直连型交换机为例
第一步 安装RabbitMQ (windows 端) 和 Erlang 客户端
这个网上的教程很多,不过建议直接从官网下载,解压之后,和配置JDK一样配置系统变量,之后设置rabbitMQ的用户和密码。一切OK后,开始建项目。
第二步 创建RabbitMQ 的生产者端(Provider)
基于SpringBoot 建立
生产端和消费端都需要引入的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
DirectRabbitConfig
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
* 【Time】2020年11月16日 上午11:29:02
* 【Function】direct exchange(直连型交换机) 有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列
* 另外两种交换机
* Fanout Exchange扇型交换机(个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。)
* Topic Exchange 主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的
*/
@Configuration
public class DirectRabbitConfig {
// 设一个队列名 testProvider
@Bean
public Queue testProvider() {
return new Queue("testProvider",true);
}
//Direct交换机
@Bean
DirectExchange testDirectExchange() {
return new DirectExchange("testDirectExchange", true, false);
}
// 将上面两个绑定起来 并设置用于匹配键 TestDirectRouting
@Bean
Binding bindingDirectExchange() {
return BindingBuilder.bind(testProvider()).to(testDirectExchange()).with("testDirectRouting");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
}
开始生产消息
@RestController
public class TestController {
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
Map<String,Object> map=new HashMap<>();
map.put("messageData","MQ,hello ");
map.put("createTime",Clock.systemUTC());
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
rabbitTemplate.convertAndSend("testDirectExchange", "testDirectRouting", map);
return "ok";
}
}
application.yml
server:
port: 8081
spring:
#给项目来个名字
application:
name: rabbitmq-provider
#配置rabbitMq 服务器
rabbitmq:
host: localhost
port: 5672
username: sch
password: 1234
management:
health:
rabbit:
enabled: false
第三步 比葫芦画瓢,创建消费端(Consumer)
DirectRabbitConfig
@Configuration
public class DirectRabbitConfig {
@Bean
public Queue testComsumer() {
return new Queue("TestComsumer",true);
}
//Direct交换机 起名:TestDirectExchange
@Bean
DirectExchange TestDirectExchange() {
return new DirectExchange("testDirectExchange");
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(testComsumer()).to(TestDirectExchange()).with("testDirectRouting");
}
}
DirectReceiver
这个是用于获取从生产端过来的信息的。需要注意的是 这里可以设置多个DirectReceiver 用于消息的接收,而不会重复。其实就类似于多线程接收消息。
@Service
@RabbitListener(queues="testProvider")
public class DirectReceiver {
@RabbitHandler
public void process(Map map) {
System.out.println("DirectReceiver得到了消息提供者发送的消息:"+map);
}
}
@Service
@RabbitListener(queues="testProvider")
public class DirectReceiver2 {
@RabbitHandler
public void process(Map map) {
System.out.println("DirectReceiver2得到了消息提供者发送的消息:"+map);
}
}
第四步 两端同时开启,生产端不断生产消息,看消费端能否消费到
- 这里的交换机DirectExchange 大家可以换成另外两个进行测试,Fanout Exchange扇型交换机 Topic Exchange 主题交换机 ,针对不同的消息类型进行不同的接收处理,大家可以尝试一下。