RabbitMQ(windows)安装与SpringBoot整合RabbitMQ

最近一些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(windows)安装与SpringBoot整合RabbitMQ_第1张图片

使用RabbitMQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态。

打开命令窗口:(因为小编已经安装好,所以图片是网上找别人的)

输入命令:(注意,要加双引号)

"D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.10\sbin\rabbitmq-plugins.bat" enable rabbitmq_management

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第2张图片

这样,就安装好插件了,是不是能使用了呢?别急,需要重启服务才行,使用命令:

net stop RabbitMQ && net start RabbitMQ

这时候的,也许会出现这种结果:

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第3张图片

“发生错误:发生系统错误 5。  拒绝访问。”

这是什么鬼?查了下,原来,5代表的是:不是系统管理员权限。

问题解决方案:使用管理员打开cmd再执行此命令:

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第4张图片

到这里算是安装完成,可以使用浏览器打开 http://localhost:15672 访问Rabbit Mq的管理控制台(使用默认的guest用户登录即可,密码一样)

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第5张图片

 

关于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项目

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第6张图片

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,其他类大家可以自己了解一下

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第7张图片

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两个队列)

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第8张图片

接下来就是如何发送消息和接收消息的问题了

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();
	}


}

运行结果

RabbitMQ(windows)安装与SpringBoot整合RabbitMQ_第9张图片

个人拙见,还希望能帮到大家。

参考文档: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

你可能感兴趣的:(RabbitMQ,SpringBoot)