web应用程序开发案例分析实验八 Spring Boot消息服务

本文详细介绍了如何在SpringBoot项目中使用RabbitMQ作为消息中间件,包括安装、配置、工作模式(发布/订阅、路由、Topics)的实现步骤和示例代码,展示了如何通过SpringBoot整合RabbitMQ进行消息通信。
摘要由CSDN通过智能技术生成

实验八 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查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小孙同学1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值