SpringBoot
【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
SpringBoot 开发实用篇
文章目录
- SpringBoot
- SpringBoot 开发实用篇
- 5 整合第三方技术
- 5.23 SpringBoot 整合 RabbitMQ(direct 模式)
- 5.23.1 AMQP
- 5.23.2 整合 RabbitMQ
- 5.23.3 小结
5 整合第三方技术
5.23 SpringBoot 整合 RabbitMQ(direct 模式)
5.23.1 AMQP
现在我们已经把RabbitMQ 装上了
之前我们做ActiveMQ 的时候
默认是p2p 模型
而在AMQP 中
5.23.2 整合 RabbitMQ
【导入坐标】
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
按照协议名导入的
【配置】
rabbitmq:
host: localhost
port: 5672
【实现】
先把之前做的 ActiveMQ 实现的注掉
【配置类】
package com.dingjiaxiong.service.impl.rabbitmq.direct.config;
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;
/**
* ClassName: RabbitConfigDirect
* date: 2022/10/22 21:29
*
* @author DingJiaxiong
*/
@Configuration
public class RabbitConfigDirect {
//存储消息的消息队列的对象
@Bean
public Queue directQueue(){
return new Queue("direct_queue"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
}
//还可以再来个队列,让它绑在同一个交换机上
@Bean
public Queue directQueue2(){
return new Queue("direct_queue2"); //是否持久化、是否连接专用、是否自动删除【后面其实有三个boolean参数,默认值是tff】
}
//消息队列不能直接使用,需要使用一个交换机去绑定它
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
//做消息队列与交换机的绑定关系
@Bean
public Binding bindingDirect(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
}
//做消息队列与交换机的绑定关系
@Bean
public Binding bindingDirect2(){
return BindingBuilder.bind(directQueue2()).to(directExchange()).with("direct2");
}
}
实现类
package com.dingjiaxiong.service.impl.rabbitmq.direct;
import com.dingjiaxiong.service.MessageService;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* ClassName: MessageServiceRabbitmqDirectImpl
* date: 2022/10/22 21:25
*
* @author DingJiaxiong
*/
@Service
public class MessageServiceRabbitmqDirectImpl implements MessageService {
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送短信的订单已纳入处理队列(rabbitmq direct),id " + id);
amqpTemplate.convertAndSend("directExchange","direct",id);
}
@Override
public String doMessage() {
return null;
}
}
做一个自动监听
package com.dingjiaxiong.service.impl.rabbitmq.direct;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* ClassName: MessageListener
* date: 2022/10/22 21:40
*
* @author DingJiaxiong
*/
@Component
public class MessageListener {
//收一个消息
@RabbitListener(queues = "direct_queue")
public void receive(String id){
System.out.println("已完成短信发送业务(rabbitmq direct),id:" + id);
}
}
有了这个监听就不用去手动消费了
OK, 直接开启服务器测试
生产一个
这个就是listener 自动处理的
看看控制台
可以看到已经有两个消息队列了
来自我们初始化时,配置类中
这两个东西
稍微修改一下
把监听类放到一个包里
将其复制一个2
package com.dingjiaxiong.service.impl.rabbitmq.direct.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* ClassName: MessageListener
* date: 2022/10/22 21:40
*
* @author DingJiaxiong
*/
@Component
public class MessageListener2 {
//收一个消息
@RabbitListener(queues = "direct_queue")
public void receive(String id){
System.out.println("已完成短信发送业务(rabbitmq direct two),id:" + id);
}
}
现在就有两个监听, 而且都监听的是同一个队列
直接启动看看效果
我一共发了四次
可以看到它俩是轮流着在对消息进行处理
就是这样,回顾一下
- 导入SpringBoot整合RabbitMQ坐标
- 配置RabbitMQ (采用默认配置)
- 定义消息队列(direct)
- 定义消息队列(direct)
- 生产与消费消息(direct)
- 使用消息监听器对消息队列监听(direct)
- 使用多消息监听器对消息队列监听进行消息轮循处理(direct)
5.23.3 小结
- SpringBoot整合RabbitMQ直连交换机模式【direct】