RabbitMQ在SpringBoot中的应用

之前介绍的RabbitMQ的几种工作模式主要是体现其思想,下面是基于SpringBoot来针对RabbitMQ的几种工作模式的开发.

工作模式(work)

一.引入依赖

可以通过Spring项目创建时直接勾选Spring for RabbitMQ,也可以手动去中央仓库中下载.

二.添加配置

复制代码
spring:
 rabbitmq:
 host: 110.41.51.65 RabbitMQ服务器所在的服务器IP
 port: 15673 #默认
 username: admin
 password: admin
 virtual-host: zwl #默认值为/

三.生产者代码

1.声明队列

复制代码
@Configuration
public class RabbitMQConfig {
    @Bean("workQueue")
    public static Queue workQueue(){
        return QueueBuilder.durable(Constants.work_queue).build();
        //声明队列的名字状态
    }
    }

2.声明交换机

此处使用的是默认的交换机,所以交换机名称为空,rountingkey和队列同名.

3.发送消息

发送消息需要使用RabbitTemplate这个对象,它可以直接注入使用.

复制代码
@RequestMapping("/request")
@RestController
public class ProducerController {
    @Autowired
    public RabbitTemplate rabbitTemplate;

    @RequestMapping("/work")
    public String ha(){
        rabbitTemplate.convertAndSend("", Constants.work_queue,"我是消息");
        return "发送成功";
    }
}

4.观察结果

使用浏览器访问完后,就可以通过RabbitMQ可视化界面进行观察.

四.消费者代码

消费者需要知道RabbitListener这个监听类,此类可以监听指定的队列,从里面拿消息.

使用时RabbitListener时会立刻消费消息.

复制代码
@Component
public class FanoutListener {
    @RabbitListener(queues = Constants.fanout_queue1)
    //此处的形参也可以设置为Message类,接受到的就是更加详细的消息
    public void queueListener1(String message){
        System.out.println("接收到消息::::::::::"+message);
    }
}

发布订阅模式(publish)

前两步和上面的work一样,发布订阅模式有三种不同状态的交换机,这里演示其中的两种.

生产者代码(fanout)

1.声明队列和交换机

复制代码
@Bean("fanoutQueue1")
    public static Queue fanoutQueue1(){
        return QueueBuilder.durable(Constants.fanout_queue1).build();
    }

    @Bean("fanoutQueue2")
    public static Queue fanoutQueue2(){
        return QueueBuilder.durable(Constants.fanout_queue2).build();
    }

    @Bean("fanoutExchange")
    public static FanoutExchange fanoutExchange(){
        return ExchangeBuilder.fanoutExchange(Constants.fanout_exchange).durable(true).build();
    }

2.建立连接

发布订阅模式需要将队列和交换机之间建立连接,因为是fanout(广播)模式,消息会发给和交换机绑定所有的队列.

复制代码
 //建立连接
    @Bean("fanoutBinding1")//形参中需要声明交换机的类型,加Qualifier注解是为了让Spring通过Bean的名称寻找Bean
    public Binding fanoutBinding1(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue1") Queue queue){
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

    @Bean("fanoutBinding2")
    public Binding fanoutBinding2(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

3.发送消息

复制代码
 @RequestMapping("/fanout")
    public String ha1(){
//三个参数是交换机名称,Rountingkey,消息正文
        rabbitTemplate.convertAndSend(Constants.fanout_exchange, "","我是消息112121212");

        return "发送成功";
    }

四.消费者代码

监听两个队列进行消费.

复制代码
@Component
public class FanoutListener {
    @RabbitListener(queues = Constants.fanout_queue1)
    public void queueListener1(String message){
        System.out.println("接收到消息::::::::::"+message);
    }
    @RabbitListener(queues = Constants.fanout_queue2)
    public void queueListener2(String message){
        System.out.println("接收到消息????????????????????"+message);
    }

}

生产者代码(Direct)

1.声明交换机和队列

复制代码
@Bean("directQueue1")
    public static Queue directQueue1(){
        return QueueBuilder.durable(Constants.direct_queue1).build();
    }

    @Bean("directQueue2")
    public static Queue directQueue2(){
        return QueueBuilder.durable(Constants.direct_queue2).build();
    }
    @Bean("directExchange")
    public static DirectExchange directExchange(){
        return ExchangeBuilder.directExchange(Constants.direct_exchange).durable(true).build();
    }

2.建立连接

建立连接时需要指定连接的方式,这里使用这样的连接方式.

复制代码
 @Bean("directBinding1")
    public Binding directBinding1(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue1") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("orange");
    }

    @Bean("directBinding2")
    public Binding directBinding2(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("black");
    }
    @Bean("directBinding3")
    public Binding directBinding3(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("orange");
    }

3.发送消息

复制代码
@RequestMapping("/direct/{ha}")
    public String directProduct(@PathVariable("ha") String routingKey){
        //routingKey作为参数传递
        rabbitTemplate.convertAndSend(Constants.direct_exchange,
                routingKey,"hello spring boot: direct "+routingKey);
        System.out.println("++++++++++++++++++++++++++");
        return "发送成功";
    }

消费者代码

复制代码
@RabbitListener(queues = Constants.direct_queue1)
    public void queueListener1(String message){
        System.out.println("接收到消息队列1::::::::::"+message);
    }
    @RabbitListener(queues = Constants.direct_queue2)
    public void queueListener2(String message){
        System.out.println("接收到消息队列2????????????????????"+message);
    }
相关推荐
计算机学姐1 小时前
基于SpringBoot的高校爱心慈善管理系统
java·vue.js·spring boot·后端·spring·tomcat·mybatis
vx+_bysj68691 小时前
springboot 旅行小程序97353
spring boot·后端·小程序·旅行小程序
都叫我大帅哥1 小时前
Apache Tika 4.0 正式发布:RAG 时代文件解析的终极答案
java·spring boot·spring
大梦想家a2 小时前
基于 Spring Boot 的物流运单管理系统后端设计与实现(JWT + MyBatis-Plus + MySQL)
spring boot·mysql·mybatis
步行cgn11 小时前
YAML 的语法规则
spring boot·后端
骇客野人12 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
摇滚侠12 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
wxwx_bscxy32213 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
摇滚侠16 小时前
《SpringBoot 3:入门与应用实战》第 9 章 跨域问题 阅读笔记 27
spring boot·笔记·okhttp