RabbitMQ是MQ产品中的目前较为流行的产品之一,它遵从AMQP协议。RabbitMQ的底层实现语言使用的是Erlang,所以安装RabbitMQ需要先安装Erlang。
windows版安装包下载地址:https/www.erlang.org/downloads
下载完毕后得到exe安装文件,一键傻瓜式安装,安装完毕需要重启,需要重启,需要重启。
Erlang安装后需要配置环境变量,否则RabbitMQ将无法找到安装的Erlang。需要配置项如下,作用等同JDK配置环境变量的作用。安装过程跟JDK一模一样,大家加油。
%ERLANG_HOME%bin;
windows版安装包下载地址:https://rabbitmq.com/install-windows.html
下载安装后得到以下目录
运行sbin目录下的rabbitmq-service.bat命令即可,start参数表示启动,stop参数表示退出,默认对外服务端口5672。
rabbitmq-service.bat start # 启动服务
rabbitmq-service.bat stop # 停止服务
rabbitmqctl status # 查看服务状态
注意:启动rabbitmq的过程实际上是开启rabbitmq对应的系统服务,需要管理员权限方可执行。即我们需要使用管理员身份打开命令提示符,或者打开任务管理器,手动启动
访问web管理服务
RabbitMQ也提供有web控制台服务,但是此功能是一个插件,需要先启用才可以使用。
rabbitmq-plugins.bat enable rabbitmq_management # 启动rabbitmq_management插件
启动插件后可以在插件运行状态中查看是否运行,运行后通过浏览器即可打开服务后台管理界面
http://localhost:15672
输入用户名密码,均为guest
至此,我们相关软件安装已经准备完毕,接下来我们就来使用rabbitMQ这个消息中间件。
导入springboot整合amqp的starter,amqp协议默认实现为rabbitmq方案
org.springframework.boot
spring-boot-starter-amqp
spring:
rabbitmq:
host: localhost
port: 5672
由于RabbitMQ不同模型要使用不同的交换机,因此需要先初始化RabbitMQ相关的对象,例如队列,交换机等
队列Queue与直连交换机DirectExchange创建后,还需要绑定他们之间的关系Binding,这样就可以通过交换机操作对应队列。
@Configuration
public class RabbitConfigDirect {
@Bean
public Queue directQueue(){
return new Queue("direct_queue");
}
@Bean
public Queue directQueue2(){
return new Queue("direct_queue");
}
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
//绑定队列与交换机
@Bean
public Binding bindingDirect(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
}
@Bean
public Binding bindingDirect2(){
return BindingBuilder.bind(directQueue2()).to(directExchange()).with("direct2");
}
}
@Service
public class MsgServiceRabbitmqDirectImpl implements MsgService {
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendMsg(String id) {
System.out.println("已将待处理消息加入队列,id :"+id);
//参数1:交换机名称,2:绑定队列与交换机的名称,3:传递的参数
amqpTemplate.convertAndSend("directExchange","direct",id);
}
}
使用消息监听器在服务器启动后,监听指定位置,当消息出现后,立即消费消息。
使用注解@RabbitListener定义当前方法监听RabbitMQ中指定名称的消息队列。
这里我绑定了两个队列,rabbitMQ会轮流使用两个消息队列,我们运行看一下结果。
@Component
public class MsgListener {
@RabbitListener(queues = "direct_queue")
public void receive(String id){
System.out.println("已完成短信发送业务(rabbitmq)" + id);
}
}
@Component
public class MsgListener2 {
@RabbitListener(queues = "direct_queue")
public void receive(String id){
System.out.println("已完成短信发送业务(rabbitmq2)" + id);
System.out.println();
}
}
ok,总结一下,首先使用rabbitMQ消息中间件可以使用监听技术来实现消息自动发送。其次,使用交换机绑定多个队列,队列会轮流使用。
整合rabbitMQ中的Topic模型的第一步和第二步跟整合direct模型一样,这里省略。
主题模式支持routingKey匹配模式,*表示匹配一个单词,#表示匹配任意内容,这样就可以通过主题交换机将消息分发到不同的队列中
@Configuration
public class RabbitConfigTopic {
@Bean
public Queue topicQueue(){
return new Queue("topic_queue");
}
@Bean
public Queue topicQueue2(){
return new Queue("topic_queue2");
}
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("topicExchange");
}
//绑定队列与交换机
@Bean
public Binding bindingtopic(){
//return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.order.id");
return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.*.id");
}
@Bean
public Binding bindingtopic2(){
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic.order.*");
}
}
发送消息后,根据当前提供的routingKey与绑定交换机时设定的routingKey进行匹配,规则匹配成功消息才会进入到对应的队列中。
@Service
public class MsgServiceRabbitmqTopicImpl implements MsgService {
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendMsg(String id) {
System.out.println("已将待处理消息加入队列,id :"+id);
//参数1:交换机名称,2:绑定队列与交换机的名称,3:传递的参数
amqpTemplate.convertAndSend("topicExchange","topic.order.id",id);
}
}
使用注解@RabbitListener定义当前方法监听RabbitMQ中指定名称的消息队列。
@Component
public class MsgListener {
@RabbitListener(queues = "topic_queue")
public void receive(String id){
System.out.println("已完成短信发送业务(rabbitmq111)" + id);
}
@RabbitListener(queues = "topic_queue2")
public void receive2(String id){
System.out.println("已完成短信发送业务(rabbitmq222)" + id);
}
}
可以看出,两种绑定方法都能将当前提供的routingKey与绑定交换机时设定的routingKey进行匹配。
忘记给你们看一下rabbitMQ中的队列。下图是两次运行结果后产生的队列。