-
作用
-
消息中间件—RabbitMQ
概念
生产者
- 消费者
- 队列
- 交换机
- 路由
- channel
- 持久化
- 自动删除
-
交换机
具有路由表的路由程序,每个消息都有一个路由键(routing key)的属性,是一个简单的字符串。
- direct直连处理路由键一对一匹配,key完全一致。
- fanout广播不处理路由键,发送到交换机的消息转发到所以绑定的队列。
- topic主题路由键和某模式进行匹配,此时队列需要绑定一个模式上,符号“#”匹配一个或多个词,通配符“ ”匹配不多不少一个词。
“audit.#”能够匹配到“audit.irs.corporate”,但是“audit. ” 只会匹配到“audit.irs”。(匹配才会转发) headers首部忽略路由键的方式,规则是通过Headers信息来交换,有点像http请求头,当一个交换机声明首部交换机,绑定一个队列的时候,定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当hash内容匹配上的时候,消息就会被写入队列。
模式
配置
spring:
#rabbitmq配置
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
publisher-confirms: true # 开启消息确认,这可不用管
virtual-host: /
简单simple,点对点
- 工作模式work,多个消费者
- 轮询分发:
- 公平分发:能者多劳、必须手动ack
- 发布订阅
- 生产者是把消息发到交换机,然后交换机把数据发送到绑定的队列上。如果没有队列与之绑定,信息将会丢失,交换机不能存储信息。消费者监听队列,有就消费。
- 路由模式
- 交换机路由键匹配到才发送
- 主题topic
- 高可用
- confirm模式
- 消息持久化才算消费成功
- ack机制
- confirm模式
创建过程
- 发送者代码 ```java @Autowired private RabbitTemplate rabbitTemplate ;
public void send(){ String str = “mq msg send … “ + new Date() rabbitTemplate.covertAndSend(“mymq” + str); }
- 接收者代码
```java
//消息发送到交换机,交换机根据不同的key发送到不同的队列
@RabbitListener(bindings = @QueueBinding(exchange = @Exchange("mymq),
key = "haha",
value = @Queue("hehe)))
public void receive(String str){
log.info("mq = {}",str);
}
//接收消息
@RabbitListener(bindings = @QueueBinding(
value = @Queue("fruitOrder"),
key = "ff",
exchange = @Exchange("mymq")
))
public void receiveff(String str){
log.info("mq = {}",str);
}