前言:本人初学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
username和password 一般默认的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),登陆后,可看到两个队列各收到一条消息如下图:
启动消费者所在的项目,控制台即可打印出接收到的消息。