-
流程:
消息生产者生产一条消息(Message) ->
发送给服务器(Broker) ->
Broker把消息给合适的交换器(Exchange) ->
交换器绑定了很多队列(Queues) ->
交换器根据绑定规则(Bindings)把消息交给指定队列
消费者连接相应队列取走消息 -
交换器类型:
-
direct(点对点)
只有发送消息时候的路由键 和 队列绑定的路由键完全一样才算匹配上
-
fanout (广播模式)
只要发送消息,无论路由键是什么都会给每个绑定的队列 -
topic
topic允许路由键使用通配符,#匹配0个或多个单词,*匹配一个单词
-
测试环境安装rabbitmq
下载Erlang
erlang环境变量
cmd erl 检查是否配置成功
erlang版本下载的24.2,那面rabbitmq版本区间如下
下载rabbitmq
rabbitmq sbin -> cmd -> rabbitmq-plugins enable rabbitmq_management
rabbitmq sbin/rabbitmq-server.bat 即可启动
访问路径 http://localhost:15672 默认账号密码 guest guest
延时队列
// ====================================== 延时配置 =============================================================
// 任务订单, 延时Exchange
@Bean("taskDelayExchange")
public DirectExchange delayExchange(){
return new DirectExchange(ResourceKeys.RabbitMQ.TASK_DELAY_EXCHANGE);
}
// 声明延时队列,并绑定到对应的死信交换机
@Bean("taskDelayQueue")
public Queue taskDelayQueue(){
Map<String, Object> args = Maps.newHashMapWithExpectedSize(2);
// x-dead-letter-exchange 这里声明当前队列绑定的死信交换机
args.put("x-dead-letter-exchange", ResourceKeys.RabbitMQ.TASK_DEAD_EXCHANGE);
// x-dead-letter-routing-key 这里声明当前队列的死信路由key
args.put("x-dead-letter-routing-key", ResourceKeys.RabbitMQ.TASK_DEAD_ROUTING_KEY);
// x-message-ttl 声明队列的TTL
args.put("x-message-ttl", 6000);
return QueueBuilder.durable(ResourceKeys.RabbitMQ.TASK_DELAY_QUEUE).withArguments(args).build();
}
@Bean
public Binding taskDelayBinding(@Qualifier("taskDelayQueue") Queue queue,
@Qualifier("taskDelayExchange") DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ResourceKeys.RabbitMQ.TASK_DELAY_ROUTING_KEY);
}
// ====================================== 死信配置 =============================================================
// 任务订单, 死信Exchange
@Bean("taskDeadExchange")
public DirectExchange deadLetterExchange(){
return new DirectExchange(ResourceKeys.RabbitMQ.TASK_DEAD_EXCHANGE);
}
// 任务订单, 死信queue
@Bean("taskDeadQueue")
public Queue deadLetterQueueA(){
return new Queue(ResourceKeys.RabbitMQ.TASK_DEAD_QUEUE);
}
@Bean
public Binding taskDeadBinding(@Qualifier("taskDeadQueue") Queue queue,
@Qualifier("taskDeadExchange") DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ResourceKeys.RabbitMQ.TASK_DEAD_ROUTING_KEY);
}
配置两个队列,一个延时队列,一个死信队列
生产者生产一条消息发送给延时交换机(携带延时路由键),延时队列配置了ttl,当消息抵达延时队列ttl到期后就会转发到死信交换机,监听死信队列即可