SpringBoot 整合 RibbitMq 实现发送消息

一:首先得安装ribbitmq的服务,参考博客。

二:了解RibbitMq的基本原理,以及使用方法。

SpringBoot 整合 RibbitMq 实现发送消息_第1张图片
SpringBoot 整合 RibbitMq 实现发送消息_第2张图片
SpringBoot 整合 RibbitMq 实现发送消息_第3张图片
关键名词:

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
Channel(信道):消息推送使用的通道;
Exchange(交换器):用于接受、分配消息;
Queue(队列):用于存储生产者的消息;
RoutingKey(路由键):用于把生成者的数据分配到交换器上;
BindingKey(绑定键):用于把交换器的消息绑定到队列上;

三:本博客将采用Fanount-Exchange消息模型,附上代码,代码上有详细注解

  1. 首先创建一个springboot多模块项目,创建完后配置生产者和消费者的application.yml

消费者:
SpringBoot 整合 RibbitMq 实现发送消息_第4张图片
生产者:
SpringBoot 整合 RibbitMq 实现发送消息_第5张图片
这里的username和password都是默认的guest

2.springboot整合ribbitMq的配置类:

package com.example.producer.config;


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

@Configurable
public class RibbitMqConfig {
    //队列名称
    public static final String QUEUE_INFROM_EMAIL = "queue_infrom_email";
    public static final String QUEUE_INFROM_SMS = "queue_infrom_sms";
    //交换机名称
    public static final String ExCHANGE_TOPICS_INFROM = "exchange_topics_infrom";
    //routingKey
    public static final String ROUTINGKEY_EMAIL = "infrom.#.email.#";
    public static final String ROUTINGKEY_SMS = "infrom.#.sms.#";

    /**
     * 声明交换机
     * topicExchange : 声明通配符交换机
     * fanoutExchange :发布订阅
     * directExchange :路由交换机
     * @return
     */
    @Bean(ExCHANGE_TOPICS_INFROM)
    public Exchange ExCHANGE_TOPICS_INFROM(){
        //.durable(true) 交换机持久化,mq重启后交换机还在
        return ExchangeBuilder.topicExchange(ExCHANGE_TOPICS_INFROM).durable(true).build();
    }

    /**
     * 声明QUEUE_INFROM_EMAIL队列
     */
    @Bean(QUEUE_INFROM_EMAIL)
    public Queue QUEUE_INFROM_EMAIL(){
        return new Queue(QUEUE_INFROM_EMAIL);
    }

    /**
     * 声明QUEUE_INFROM_SMS队列
     */
    @Bean(QUEUE_INFROM_SMS)
    protected Queue QUEUE_INFROM_SMS(){
        return new Queue(QUEUE_INFROM_SMS);
    }

    /**
     * QUEUE_INFROM_EMAIL队列绑定交换机,指定ROUTINGKEY
     * @Qualifier :指定名称注入队列和交换机
     * .with(ROUTINGKEY_EMAIL) :根据指定的路由key绑定
     * .noargs() :没有其他参数
     */
    @Bean
    public Binding BINDING_QUEUE_INFROM_EMAIL(@Qualifier(QUEUE_INFROM_EMAIL) Queue queue,@Qualifier(ExCHANGE_TOPICS_INFROM) Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_EMAIL).noargs();
    }

    /**
     * QUEUE_INFROM_SMS队列绑定交换机,指定ROUTINGKEY
     * @Qualifier :指定名称注入队列和交换机
     * .with(ROUTINGKEY_SMS) :根据指定的路由key绑定
     * .noargs() :没有其他参数
     */
    @Bean
    public Binding BINDING_QUEUE_INFROM_SMS(@Qualifier(QUEUE_INFROM_SMS) Queue queue,@Qualifier(ExCHANGE_TOPICS_INFROM) Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_SMS).noargs();
    }
}

步骤:声明交换机,声明队列,绑定队列到对应的交换机

四:生产者发送消息

package com.example.producer;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBootRibbtmaProducerApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;

    //使用springboot提供的rabbitTemplate发送消息
    @Test
    void sendEmailMessage() {
        /**
         * 参数:
         * 1. 交换机名称
         * 2. routingKey
         * 3. 消息内容
         */
        rabbitTemplate.convertAndSend("exchange_topics_infrom","inform.email","send email to user");
    }

}

使用springboot的rabbitTemplate来发送消息,convertAndSend的重载方法有很多,这里用的参数有:交换机名称,路由key,消息内容。

运行程序之后,我们就能看到交换机、队列已经被声明,并且消息也发送成功了:
交换机:
SpringBoot 整合 RibbitMq 实现发送消息_第6张图片
两个队列:
SpringBoot 整合 RibbitMq 实现发送消息_第7张图片
其中一个队列产生了一个消息:
SpringBoot 整合 RibbitMq 实现发送消息_第8张图片
发送成功!

五:消费者接收消息。

package com.example.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import sun.plugin2.message.Message;
import java.nio.channels.Channel;

@Component
public class ConsumerListener {
    /**
     * 接收队列消息
     * @param mes 可以直接接收字符串消息
     * @param message 得到消息内容
     * @param channel 得到通道
     */
    @RabbitListener(queues = {"queue_infrom_email"}) //存放一个或者多个队列名称
    public void receptionEmail(String mes, Message message, Channel channel){
        System.out.println(mes);
    }

}

注意:该类必须交给spring管理,所以要加上@Component注解。(@service 之类的注解也行)。

完结!

你可能感兴趣的:(java)