springBoot整合RabbitMq的简单使用

前言:小刘在复习路上不断前行。这不,想到了和springboot一起使用。

MQ介绍就不再赘述;

配置:

SpringBoot 整合rabbitMq
Maven:
    <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
   </dependency>
配置:
spring.application.name=Spring-boot-rabbitmq
spring.rabbitmq.host=192.168.0.86
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

五种常用的工作模式

HelloWorld---和工作队列

配置:

@Configuration
public class RabbitMqConfigHelloWorld {
    /**
     * 声明队列
     * @return
     */
    @Bean
    public Queue Queue() {
        return new Queue("hello_springBoot");
    }
}

广播---发布订阅

package com.example.rmq_springboot_demo01.rabbitConfig;

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 FanoutRabbitConfig {

    /**
     * 声明队列
     * @return
     */
    public final static String FANOUT_QUEUE_NAME1 = "fanout.springboot.message1";//队列1
    public final static String FANOUT_QUEUE_NAME2 = "fanout.springboot.message2";//队列2
    public final static String EXCHANGE_FANOUT="exchange.springboot";//交换机名称

    /**
     * 队列一
     * @return
     */
    @Bean(name = "FANOUT_QUEUE_NAME1")
    public Queue QUEUE_NAME1() {
        return new Queue(FanoutRabbitConfig.FANOUT_QUEUE_NAME1);
    }

    /**
     * 队列二
     * @return
     */
    @Bean(name = "FANOUT_QUEUE_NAME2")
    public Queue QUEUE_NAME2() {
        return new Queue(FanoutRabbitConfig.FANOUT_QUEUE_NAME2);
    }

    /**
     * 声明广播类型的交换机
     * @return
     */
    @Bean(name = "EXCHANGE_FANOUT")
    FanoutExchange EXCHANGE_FANOUT() {
        return new FanoutExchange(FanoutRabbitConfig.EXCHANGE_FANOUT);
    }
    /**
     * 队列绑定交换机
     * @param FANOUT_QUEUE_NAME1
     * @param fanoutExchange
     * @return
     */
    @Bean
    Binding bindingExchangeA(@Qualifier("FANOUT_QUEUE_NAME1") Queue FANOUT_QUEUE_NAME1, @Qualifier("EXCHANGE_FANOUT") FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(FANOUT_QUEUE_NAME1).to(fanoutExchange);
    }

    @Bean
    Binding bindingExchangeB(@Qualifier("FANOUT_QUEUE_NAME2") Queue FANOUT_QUEUE_NAME2,@Qualifier("EXCHANGE_FANOUT") FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(FANOUT_QUEUE_NAME2).to(fanoutExchange);
    }

}

路由配置:

/**
 * Routing----根据routing key的不同将消息发送给不同的队列
 */
@Configuration
public class RoutingRabbitConfig {
    public final static String ROUTING_QUEUE_NAME1 = "routing.springboot.message1";//队列1
    public final static String ROUTING_QUEUE_NAME2 = "routing.springboot.message2";//队列2
    public final static String EXCHANGE_ROUTING="routing.exchange.springboot";//交换机名称
    public final static String ROUTING_KEY1="routing.routing_key.springboot";//routing1
    public final static String ROUTING_KEY2="routing.routing_key.springboot";//routing2

    /**
     * 声明队列一
     * @return
     */
    @Bean(name = "ROUTING_QUEUE_NAME1")
    public Queue ROUTING_QUEUE_NAME1() {
        return new Queue(RoutingRabbitConfig.ROUTING_QUEUE_NAME1);
    }
    /**
     * 声明队列二
     * @return
     */
    @Bean(name = "ROUTING_QUEUE_NAME2")
    public Queue ROUTING_QUEUE_NAME2() {
        return new Queue(RoutingRabbitConfig.ROUTING_QUEUE_NAME2);
    }

    /**
     * 声明交换机
     * @return
     */
    @Bean(name = "EXCHANGE_ROUTING")
    TopicExchange EXCHANGE_ROUTING() {
        return new TopicExchange(EXCHANGE_ROUTING);
    }

    /**
     * 交换机绑定队列
     * @param ROUTING_QUEUE_NAME1
     * @param EXCHANGE_ROUTING
     * @return
     */
    @Bean
    Binding bindingExchangeMessage(@Qualifier("ROUTING_QUEUE_NAME1") Queue ROUTING_QUEUE_NAME1, @Qualifier("EXCHANGE_ROUTING") TopicExchange EXCHANGE_ROUTING) {
        return BindingBuilder.bind(ROUTING_QUEUE_NAME1).to(EXCHANGE_ROUTING).with(ROUTING_KEY1);
    }

    @Bean
    Binding bindingExchangeMessages(@Qualifier("ROUTING_QUEUE_NAME2") Queue ROUTING_QUEUE_NAME2,@Qualifier("EXCHANGE_ROUTING") TopicExchange EXCHANGE_ROUTING) {
        return BindingBuilder.bind(ROUTING_QUEUE_NAME2).to(EXCHANGE_ROUTING).with(ROUTING_KEY2);
    }
}

通配符配置:

/**
 * Topic模式----即更为高级的路由模式
 */
@Configuration
public class TopicRabbitConfig {
    /**
     * 通配符  . 一个字符
     *         #一个或者多个字符
     */
    public final static String TOPIC_QUEUE_NAME1 = "topic_springboot_email_inform";//队列邮件
    public final static String TOPIC_QUEUE_NAME2="topic_springboot_sms_inform";//队列手机
    public final static String TOPIC_ROUT_EMAIL_KEY="topic_routing.#.email.#";//routing_key
    public final static String TOPIC_ROUT_SMS_KEY="topic_routing.#.sms.#";//routing_key
    public final static String TOPIC_EXCHANGE_TOPIC="topic_springboot_exchange";//交换机

    /**
     * 声明队列一
     * @return
     */
    @Bean(name = "TOPIC_QUEUE_NAME1")
    public Queue TOPIC_QUEUE_NAME1() {
        return new Queue(TopicRabbitConfig.TOPIC_QUEUE_NAME1);
    }

    /**
     * 声明队列二
     * @return
     */
    @Bean(name = "TOPIC_QUEUE_NAME2")
    public Queue TOPIC_QUEUE_NAME2() {
        return new Queue(TopicRabbitConfig.TOPIC_QUEUE_NAME2);
    }

    /**
     * 声明交换机
     * @return
     */
    @Bean(name = "TOPIC_EXCHANGE_TOPIC")
    TopicExchange TOPIC_EXCHANGE_TOPIC() {
        return new TopicExchange(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC);
    }

    /**
     * 交换机绑定队列---根据routing_key
     * @param queueMessage
     * @param exchange
     * @return
     */
    @Bean
    Binding bindingTopicExchangeMessage(@Qualifier("TOPIC_QUEUE_NAME1") Queue queueMessage, @Qualifier("TOPIC_EXCHANGE_TOPIC") TopicExchange exchange) {
        return BindingBuilder.bind(queueMessage).to(exchange).with(TopicRabbitConfig.TOPIC_ROUT_EMAIL_KEY);
    }

    @Bean
    Binding bindingTopicExchangeMessages(@Qualifier("TOPIC_QUEUE_NAME1") Queue queueMessages, @Qualifier("TOPIC_EXCHANGE_TOPIC") TopicExchange exchange) {
        return BindingBuilder.bind(queueMessages).to(exchange).with(TopicRabbitConfig.TOPIC_ROUT_SMS_KEY);
    }
}

生产者:在测试中写的;

 @Autowired
    RabbitTemplate rabbitTemplate;

    
    /**rabbitTemplate.convertAndSend(String exchange, String routingKey, Object object)
     * String exchange,   交换机
     * String routingKey  routing_key(特别说明,当没有routing_key模式的工作,会默认队列名称)
     * Object object      发送消息体
     * helloWorld 模式发送
     */
    @Test
    public void send(){
        String context = "hello " + new Date();
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend("hello_springBoot", context);
    }


    /**
     * 工作队列 模式发送
     */
    @Test
    public void send2(){
        for (int i=0;i<20;i++){
            String context = "Sender : "+i+"發送" +"hello " + new Date();
            System.out.println("Sender : "+i+"發送" + context);
            this.rabbitTemplate.convertAndSend("hello_springBoot", context);
        }
    }

    /**
     *------广播模式发送
     */
    @Test
    public void sendFanOut(){
        for (int i=0;i<5;i++){
            String context = "hi, fanout msg ";
            System.out.println("Sender : " + context);
            this.rabbitTemplate.convertAndSend(FanoutRabbitConfig.EXCHANGE_FANOUT,"", context);
        }
    }


    /**
     * 发送队列一
     */
    @Test
    public void routing1() {
        String context = "hi, i am message 1";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend(RoutingRabbitConfig.EXCHANGE_ROUTING, RoutingRabbitConfig.ROUTING_KEY1, context);
    }

    /**
     * 发送队列二
     */
    @Test
    public void routing2() {
        String context = "hi, i am messages 2";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend(RoutingRabbitConfig.EXCHANGE_ROUTING, RoutingRabbitConfig.ROUTING_KEY2, context);
    }


    /**
     * 通配符模式测试
     */

    @Test
    public void topic1() {
        String context = "hi, i am message 1---";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC, "topic_routing.email", context);
    }

    @Test
    public void topic2() {
        String context = "hi, i am messages 2";
        System.out.println("Sender : " + context);
        this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE_TOPIC,"topic_routing.sms", context);
    }

消费者:统一模板:

@Component
@RabbitListener(queues = "hello_springBoot")
public class HelloReceiver2 {

    @RabbitHandler
    public void process(String msg) {
        System.out.println("消费者二接收  : " + msg);
    }
}

特别注意:队列名称;主要是用通配符模式和路由模式

如有不解,请加java爱好群大家交流:852665736;群里都是热心好客的小伙伴,大家一同进步。

无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注微信公众号:gh_817962068649 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值