实验八 Spring Boot消息服务
一、实验目的
1、了解为什么要使用消息中间件
2、属性Rabbit MQ消息中间件的基本概念和工作原理
3、属性Spring Boot与Rabbit MQ的整合搭建
4、掌握Spring Boot与Rabbit MQ的整合实现常用的工作模式
二、实验内容
1、通过实际开发介绍,引入项目中消息服务的重要。
2、进入主题,讲解Spring Boot中消息服务。
3、安装Rabbit MQ、完成Spring Boot整合Rabbit MQ环境搭建。
4、掌握Publish/Subscribe发布/订阅工作模式。
5. Routing路由工作模式、Topics通配符工作模式。
三、实验步骤
1.安装Rabbit MQ
安装完成后在浏览器上访问http://lovalhost:15672
2.Spring Boot整合RabbitMQ环境搭建
① 创建Spring Boot项目,添加Web依赖以及RabbitMQ依赖。
② 在pplication.properties配置文件中编写需要设置的配置属性。
# 配置RabbitMQ消息中间件连接配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#配置RabbitMQ虚拟主机路径/,默认可以省略
spring.rabbitmq.virtual-host=/
3.Publish/Subscribe发布/订阅工作模式。
(1)基于API的方式
① 使用AmqpAdmin定制消息发送组件
在测试类中添加
@RunWith(SpringRunner.class)
@SpringBootTest
public class Ch08ApplicationTests {
@Autowired
private AmqpAdmin amqpAdmin;
@Test
public void amqpAdmin() {
// 1、定义fanout类型的交换器
amqpAdmin.declareExchange(new FanoutExchange("fanout_exchange"));
// 2、定义两个默认持久化队列,分别处理email和sms
amqpAdmin.declareQueue(new Queue("fanout_queue_email"));
amqpAdmin.declareQueue(new Queue("fanout_queue_sms"));
// 3、将队列分别与交换器进行绑定
amqpAdmin.declareBinding(new Binding("fanout_queue_email",Binding.DestinationType.QUEUE,"fanout_exchange","",null));
amqpAdmin.declareBinding(new Binding("fanout_queue_sms",Binding.DestinationType.QUEUE,"fanout_exchange","",null));
}
}
② 启动测试类后在RabbitMQ中查看
③ 消息发送者发送消息
在com.lg.ch08中创建domain文件夹并在其中创建实体类User
public class User {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
④ 在测试类中添加
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void psubPublisher() {
User user=new User();
user.setId(1);
user.setUsername("石头");
rabbitTemplate.convertAndSend("fanout_exchange","",user);
}
⑤ 运行psubPublisher()测试方法
⑥ 创建配置类
在com.lg.ch08文件见你下创建config文件夹并创建RabbitMQConfig.java
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
⑥ 再次执行测试类中psubPublisher()方法
查看RabbitMQ
⑦ 消息消费者接收消息
在com.lg.ch08中创建service文件夹并在其中创建RabbitMQService.java
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
@Service
public class RabbitMQService {
@RabbitListener(queues = "fanout_queue_email")
public void psubConsumerEmail(Message message) {
byte[] body = message.getBody();
String s = new String(body);
System.out.println("邮件业务接收到消息: "+s);
}
@RabbitListener(queues = "fanout_queue_sms")
public void psubConsumerSms(Message message) {
byte[] body = message.getBody();
String s = new String(body);
System.out.println("短信业务接收到消息: "+s);
}
}
⑧ 启动项目
(2)基于配置类的方式
修改RabbitMQConfig文件
import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public Exchange fanout_exchange(){
return ExchangeBuilder.fanoutExchange("fanout_exchange").build();
}
@Bean
public Queue fanout_queue_email(){
return new Queue("fanout_queue_email");
}
@Bean
public Queue fanout_queue_sms(){
return new Queue("fanout_queue_sms");
}
@Bean
public Binding bindingEmail(){
return BindingBuilder.bind(fanout_queue_email()).to(fanout_exchange()).with("").noargs();
}
@Bean
public Binding bindingSms(){
return BindingBuilder.bind(fanout_queue_sms()).to(fanout_exchange()).with("").noargs();
}
}
(3)基于注解的方式
修改RabbitMQService文件,注释原有内容并添加
@RabbitListener(bindings =@QueueBinding(value =@Queue("fanout_queue_email"), exchange =@Exchange(value = "fanout_exchange",type = "fanout")))
public void psubConsumerEmailAno(User user) {
System.out.println("邮件业务接收到消息: "+user);
}
@RabbitListener(bindings =@QueueBinding(value =@Queue("fanout_queue_sms"),exchange =@Exchange(value = "fanout_exchange",type = "fanout")))
public void psubConsumerSmsAno(User user) {
System.out.println("短信业务接收到消息: "+user);
}
4.Routing路由工作模式
① 使用基于注解的方式定制消息组件和消息消费者
修改RabbitMQService文件,在其中添加
@RabbitListener(bindings =@QueueBinding(value =@Queue("routing_queue_error"),exchange =@Exchange(value = "routing_exchange",type = "direct"),key = "error_routing_key"))
public void routingConsumerError(String message) {
System.out.println("接收到error级别日志消息: "+message);
}
@RabbitListener(bindings =@QueueBinding(value =@Queue("routing_queue_all"),exchange =@Exchange(value = "routing_exchange",type = "direct"),key = {"error_routing_key","info_routing_key","warning_routing_key"}))
public void routingConsumerAll(String message) {
System.out.println("接收到info、error、warning等级别日志消息: "+message);
}
② 消息发送者发送消息
在测试类中添加
@Test
public void routingPublisher() {
rabbitTemplate.convertAndSend("routing_exchange","error_routing_key","routing send error message");
}
③ 运行测试
运行测试类中routingPublisher()方法
打开RabbitMQ可视化页面查看
5.Topics通配符工作模式。
① 使用基于注解的方式定制消息组件和消息消费者
修改RabbitMQService文件,在其中添加
@RabbitListener(bindings =@QueueBinding(value =@Queue("topic_queue_email"),exchange =@Exchange(value = "topic_exchange",type = "topic"),key = "info.#.email.#"))
public void topicConsumerEmail(String message) {
System.out.println("接收到邮件订阅需求处理消息: "+message);
}
@RabbitListener(bindings =@QueueBinding(value =@Queue("topic_queue_sms"),exchange =@Exchange(value = "topic_exchange",type = "topic"),key = "info.#.sms.#"))
public void topicConsumerSms(String message) {
System.out.println("接收到短信订阅需求处理消息: "+message);
}
② 消息发送者发送消息
在测试类中添加
@Test
public void topicPublisher() {
// 1、只发送邮件订阅用户消息
rabbitTemplate.convertAndSend("topic_exchange","info.email","topics send email message");
// 2、只发送短信订阅用户消息
// rabbitTemplate.convertAndSend("topic_exchange","info.sms","topics send sms message");
// 3、发送同时订阅邮件和短信的用户消息
// rabbitTemplate.convertAndSend("topic_exchange","info.email.sms","topics send email and sms message");
}
③ 运行测试
运行测试类中topicPublisher()方法
注释topicPublisher()方法中的步骤1,打开步骤2进行测试
注释topicPublisher()方法中的步骤2,打开步骤3进行测试
通过RabbitMQ查看