一、Ubuntu下安装RabbitMQ
1、安装erlang环境
apt install erlang
2、安装rabbitmq
apt install rabbitmq-server
3、添加用户,设置密码。并同时设置权限
rabbitmqctl add_user xiangyida 123456
rabbitmqctl set_user_tags xiangyida administrator
4、安装插件
rabbitmq-plugins enable rabbitmq_management
可在浏览器输入http://localhost:15672 登录后查看服务器情况
二、rabbitMQ基础
-
Message
消息。消息是不具名的,它由消息头消息体组成。消息体是不透明的,而消息头则由一系列可选
属性组成,这些属性包括:routing-key(路由键)、priority(相对于其他消息的优先
权)、delivery-mode(指出消息可能持久性存储)等。 -
Publisher
消息的生产者。也是一个向交换器发布消息的客户端应用程序。 -
Consumer
消息的消费者。表示一个从消息队列中取得消息的客户端应用程序。 -
Exchange
交换器。用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
三种常用的交换器类型
- direct(发布与订阅 完全匹配)
- fanout(广播)
- topic(主题,规则匹配)
-
Binding
绑定。用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息
队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。 -
Queue
消息队列。用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一
个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取
走。 -
Routing-key
路由键。RabbitMQ 决定消息该投递到哪个队列的规则。队列通过路由键绑定到交换器。
消息发送到 MQ 服务器时,消息将拥有一个路由键,即便是空的,RabbitMQ 也会将其和绑定使用的路由键进
行匹配。如果相匹配,消息将会投递到该队列。如果不匹配,消息将会进入黑洞。 -
Connection
链接。指 rabbit 服务器和服务建立的 TCP 链接。 -
Channel
信道。 -
Virtual Host
虚拟主机。表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证
和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有
自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在链接时指定,
RabbitMQ 默认的 vhost 是/
二、SpringBoot整合rabbitMQ
1、添加依赖
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、配置连接信息
spring:
# mq
rabbitmq:
host: 127.0.0.1
port: 5672
username: xiangyida
password: 123456
listener:
direct:
retry:
enabled: true
max-attempts: 5
3、添加配置类
package xyh.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author XiangYida
* @version 2/9/19 9:39 PM
*/
@Configuration
public class RabbitConfig {
/**
* 创建队列
*/
@Bean
public Queue createQueue1() {
return new Queue(RabbitConfig.queue1);
}
@Bean
public Queue createQueue2() {
return new Queue(RabbitConfig.queue2);
}
//交换器
public static final String exchange1 = "exchange1";
//队列
public static final String queue1 = "queue1";
public static final String queue2 = "queue2";
//路由键
public static final String routingKey1 = "routingKey1";
public static final String routingKey2 = "routingKey2";
/**
* 交换机类型
*
*/
@Bean
public DirectExchange defaultExchange() {
return new DirectExchange(exchange1);
}
/**
*
* 一个交换机可以绑定多个消息队列
*/
@Bean
public Binding binding() {
return BindingBuilder.bind(createQueue1()).to(defaultExchange()).with(RabbitConfig.routingKey1);
}
@Bean
public Binding bindingB(){
return BindingBuilder.bind(createQueue2()).to(defaultExchange()).with(RabbitConfig.routingKey2);
}
}
4、消息生产者
package xyh.rabbitmq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xyh.config.RabbitConfig;
/**
* @author XiangYida
* @version 2/9/19 9:46 PM
*/
@Component
@Slf4j
public class Sender{
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMsg(String content) {
rabbitTemplate.convertAndSend(RabbitConfig.exchange1, RabbitConfig.routingKey1, content);
}
}
5、消息接收者
package xyh.rabbitmq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import xyh.config.RabbitConfig;
/**
* @author XiangYida
* @version 2/9/19 9:49 PM
*/
@Component
@Slf4j
public class Receiver_1 {
/**
* 接收消息的方法,采用消息队列监听机制
* @param msg
*/
@RabbitListener(queues = RabbitConfig.queue1)
public void process(String msg) throws InterruptedException {
log.info("队列1接收到消息"+msg);
}
}
6、测试
2019-02-25 20:15:15.593 [SimpleAsyncTaskExecutor-1] INFO xyh.rabbitmq.Receiver_1 - 队列1接收到消息hello