最近一些SpringBoot整合RabbitMQ技术文档和博客,整理一下自己的理解,本文主要分为两点,rabbitmq的安装 和springboot整合rabbitmq。
一、RabbitMQ(Windows)安装
关于消息队列的原理,小编也收藏了一些大佬的博客(https://blog.csdn.net/AngryFyj/article/details/86487851)这里就不再去详细说明了,这里主要说明一下RabbitMQ的安装,虽然网上也有很多这方面的博客,但是还是整理一下,毕竟别人写的都是别的感受,还有这个因为是小编自己玩的,所以是Windows下的安装。
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。所以一般来说安装 RabbitMQ 之前要安装 Erlang ,根据操作系统不同官网提供了相应的安装说明:Windows、Debian / Ubuntu、RPM-based Linux、Mac
1、安装erland ,通过官方下载页面(http://www.erlang.org/downloads),然后直接打开一直下一步,完成安装。
2、安装rabbitmq,官方下载地址(https://www.rabbitmq.com/download.html),然后打开完成安装。
3、配置,激活rabbitmq's management plugin
找到自己的安装目录
使用RabbitMQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态。
打开命令窗口:(因为小编已经安装好,所以图片是网上找别人的)
输入命令:(注意,要加双引号)
"D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.10\sbin\rabbitmq-plugins.bat" enable rabbitmq_management
这样,就安装好插件了,是不是能使用了呢?别急,需要重启服务才行,使用命令:
net stop RabbitMQ && net start RabbitMQ
这时候的,也许会出现这种结果:
“发生错误:发生系统错误 5。 拒绝访问。”
这是什么鬼?查了下,原来,5代表的是:不是系统管理员权限。
问题解决方案:使用管理员打开cmd再执行此命令:
到这里算是安装完成,可以使用浏览器打开 http://localhost:15672 访问Rabbit Mq的管理控制台(使用默认的guest用户登录即可,密码一样)
关于rabbitmq的安装大家可以参考(https://www.cnblogs.com/ericli-ericli/p/5902270.html
https://baijiahao.baidu.com/s?id=1605656085633071281&wfr=spider&for=pc)
二、SpringBoot整合RabbitMQ
springboot整合rabbitmq并没有想象中那么复杂,主要与代码的方式说明一下:
1、创建一个springboot项目
2、pom.xml文件添加依赖
org.springframework.boot
spring-boot-starter-amqp
3、在application.properties添加rabbitmq的配置(这只是最基本的配置,大家可以直接添加其他更复杂的配置)
spring.rabbitmq.host = localhost
spring.rabbitmq.port = 5672
spring.rabbitmq.username = guest
spring.rabbitmq.password = guest
到这里,配置什么的就完成,接下来就是撸代码的事了
4、Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers ,这就只讲了topicd,其他类大家可以自己了解一下
topic 交换器
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。
a、创建交换机队列,并绑定
package com.ajwensome.mq.topic;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TopicRabbitConfig {
final static String message = "Q1";
static final String messages = "Q2";
/**
* 创建队列
*
* @return
*/
@Bean
public Queue queueMessage() {
return new Queue(TopicRabbitConfig.message);
}
/**
* 创建队列
*
* @return
*/
@Bean
public Queue queueMessages() {
return new Queue(TopicRabbitConfig.messages);
}
/**
* 交换机
*
* @return
*/
@Bean
public TopicExchange exchange() {
return new TopicExchange("topicExchange");
}
/**
* 绑定交换机和队列
*
* @param queueMessages
* @param exchange
* @return
*/
@Bean
public Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#"); // route key 路由规则
}
@Bean
public Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
}
}
写好这个大家就可以启动项目试一下,然后可以在rabbitmq的控制台看到创建好的交接,和队列(下图,大家可以看到我注册topicExchange关联了Q1,Q2两个队列)
接下来就是如何发送消息和接收消息的问题了
b、消息消费者 与 消息发送者
package com.ajwensome.mq.topic;
import java.io.IOException;
import java.util.Map;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;
@Component
@RabbitListener(queues = "Q2")
public class TopicReceiver2 {
@RabbitHandler
public void process(String message ,@Headers Map headers,Channel channel) throws IOException{
System.out.println("接收到信息了:》》》》Receiver2 topic.messages: "+message);
long deliveryTag = (long)headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliveryTag, false);
}
}
package com.ajwensome.mq.topic;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TopicSender {
@Autowired
AmqpTemplate amqpTemplate;
public void send1(){
String context = "hi,i am message 1222222222222222222222222";
System.out.println("Sender: "+context);
amqpTemplate.convertAndSend("topicExchange","topic.message",context);
}
public void send2(){
String context = "hi , i am messages 21111111111111111111111111";
System.out.println("Sender: "+context);
//topic.messages 是 route key
amqpTemplate.convertAndSend("topicExchange","topic.messages",context);
}
}
发送方法和接收方法已经定义好,接下来测试一下
c、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MqApplicationTests {
@Autowired
TopicSender topicSender;
@Test
public void TestTopic(){
topicSender.send1();
topicSender.send2();
}
}
运行结果
个人拙见,还希望能帮到大家。
参考文档:https://blog.csdn.net/zhuzhezhuzhe1/article/details/80454956
https://www.cnblogs.com/ericli-ericli/p/5902270.html
https://baijiahao.baidu.com/s?id=1605656085633071281&wfr=spider&for=pc