Springboot集成RabiitMq

前言:本人初学rabbitmq,此文是基础的集成步骤,对于实际项目中的应用,会在后续的项目实战中更新。。。

1、引入jar包  (之所以加上test的jar包,是为了在测试类里测试rabbitmq)

  注意:若添加依赖后maven出现jar包unknown错误,一般是由于springboot没有正确搭建,可直接指定版本号 例如:<version>2.0.4.RELEASE</version>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐starter‐amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐starter‐test</artifactId>
</dependency>

2、配置application.yml 

  注意:rabbitmq的配置中,

                          host:是远程rabbitmq的IP地址,本文是本地的ip,

                          port:rabbitmq的端口,一般默认的5672

                          usernamepassword 一般默认的guest

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtualHost: /

3、定义rabbitmq的配置类 RabbitMqConfig,在里面主要配置交换机Exchange,队列,以及把队列绑定到交换机

      注意:rabbitmq有6种模式(工作队列,订阅发布,路由,统配符,header,RPC),这里的配置类 以统配符 Topics模式为例

       事先准备一个场景:用户开通了某会员,现在需要给这个用户的email和msg 发送消息,告诉用户开通成功了,生产者可以单独发送email或msg,也可以一起发送,而用户(消费者)也可以单独接收或者一起接收,配置如下:

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {
    //需要声明的队列常量,本文例子:email队列名称常量
    public static final String QUEUE_EMAIL= "rabbitmq_topics_email";
    //需要声明的队列常量,本文例子:msg队列名称常量
    public static final String QUEUE_MSG= "rabbitmq_topics_msg";
    //需要声明的交换机常量,本文例子:交换机名称常量
    public static final String EXCHANGE_TOPIC_INFOR= "rabbitmq_topics_exchange";
    //需要声明的routingkey常量,本文例子:email  routingkey常量
    public static final String TOPICSKEY_EMAIL = "topicskey.#.email.#";
    //需要声明的routingkey常量,本文例子:msg  routingkey常量,
    //为了满足我们假设的场景需求,routingkey需要这样指定  "topicskey.#.msg.#"
    public static final String TOPICSKEY_MSG = "topicskey.#.msg.#";

    //声明交换机
    @Bean(EXCHANGE_TOPIC_INFOR)
    public Exchange EXCHANGE_TOPIC_INFOR(){
        /**
         * durable(true)持久化  mq重启之后交换机仍然存在
         */
        return ExchangeBuilder.topicExchange(EXCHANGE_TOPIC_INFOR).durable(true).build();
    }

    //本文例子:声明email队列
    @Bean(QUEUE_EMAIL)
    public Queue QUEUE_EMAIL(){
        return new Queue(QUEUE_EMAIL);
    }
    //本文例子:声明msg队列
    @Bean(QUEUE_MSG)
    public Queue QUEUE_MSG(){
        return new Queue(QUEUE_MSG);
    }

    //本文例子:绑定email交换机和队列
    @Bean
    public Binding BING_QUEUE_EMAIL(@Qualifier(QUEUE_EMAIL)Queue queue,//上文定义的队列bean
                                    @Qualifier(EXCHANGE_TOPIC_INFOR)Exchange exchange
                                    ){
        return BindingBuilder.bind(queue).to(exchange).with(TOPICSKEY_EMAIL).noargs();
    }
    //本文例子:绑定msg交换机和队列
    @Bean
    public Binding BING_QUEUE_MSG(@Qualifier(QUEUE_MSG)Queue queue,
                                    @Qualifier(EXCHANGE_TOPIC_INFOR)Exchange exchange
    ){
        return BindingBuilder.bind(queue).to(exchange).with(TOPICSKEY_MSG).noargs();
    }
}

4、写生产者类文件,完成之后,可在需要的地方注入这个类,调用发送消息的send()方法。

import club.zj.config.RabbitmqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 生产者
 * rabbitmq的入门程序
 */
@Component //交给spring管理
public class Producer_Topics_SpringBoot {

    @Autowired
    private  RabbitTemplate rabbitTemplate;

    public void send(){
        /**
         * 此处用到的convertAndSend方法的参数明细:
         * 1、exchange:交换机名称, 此处使用rabbitmq配置类中定义的交换机常量
         * 2、routingkey:发送消息是需要指定的路由key,满足这个routingkey的队列才可以接受到消息
         * 3、object:消息内容,此处我们定义String类型的email消息
         */
        String email = "send email to user";
        rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_TOPIC_INFOR,"topicskey.email.msg",email);
    }

}

5、消费者的类文件,启动项目之后,此类中的方法就会监听指定的队列是否有消息

import club.zj.config.RabbitmqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component//让spring管理
public class ReceiveHandler {
    /**
     * @RabbitListener 注解  加在方法上监听消息队列,并执行方法
     * queues = {} 大括号里写需要监听的队列名称,此处为rabbitmq配置类中的队列常量,多个队列名称用英文半角逗号,隔开
     * @param msg 接受到的消息
     * Message message 也可以接受到消息,跟上面的msg参数作用一样
     * Channel channel 还可以获取通道,此处就不演示了
     */
    @RabbitListener(queues = {RabbitmqConfig.QUEUE_EMAIL,RabbitmqConfig.QUEUE_MSG})
    public void receiveEmail(String msg){
        System.out.println(msg);//打印出接收到的消息
    }
}

6、写完生产者和消费者的类文件之后,就可以写测试类来测试了

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@SpringBootTest(classes= TestRabbitmqProductorApplication.class)//指定启动类
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRabbitMQ {
    @Autowired//注入生产者的bean
    private Producer_Topics_SpringBoot producer_topics_springBoot;
    @Test
    public void send(){//调用发送消息的方法
        producer_topics_springBoot.send();
    }
}

7、上述步骤完成后,启动单元测试,登录rabbitmq的管理页面(ip+端口15672),登陆后,可看到两个队列各收到一条消息如下图:

启动消费者所在的项目,控制台即可打印出接收到的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值