1.直连交换机:Direct Exchange
直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key, 这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。
直连交换机适用场景
有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。
交换机的工作流程
dome
1.生产者模块//消息队列和直连交换机绑定
package com.zking.provider.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;
@Configuration//代替xml配置文件
public class RabbitmqDirectConfig {
@Bean//<bean id="directQueue1"></bean>
public Queue directQueue1() {//创建一个队列
return new Queue("directQueue1", true);//true 持久化消息
}
@Bean
public DirectExchange directExchange1(){//创建一个交换机
return new DirectExchange("directExchange1");
}
@Bean
public Binding BindingDirectQueue1 (){
return BindingBuilder.bind(directQueue1()).to(directExchange1()).with("directQueue1_route");
}
}
2.生产者生产消息
package com.zking.provider.controller;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
public class MsgSendController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/send1")
public String send1() {
Map<String, Object> map = getMap();
rabbitTemplate.convertAndSend("directExchange1", "directQueue1_route", map);
return "ok";
}
/**
* 创建消息对应的模拟数据,它是一个Map集合
*/
private Map<String, Object> getMap() {
String messageId = UUID.randomUUID().toString().replace("-", "");
String messageData = "test message, Hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> map = new HashMap<String, Object>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", createTime);
return map;
}
}
3.消费者消费消息
package com.zking.consumer.mq;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@RabbitListener(queues = "directQueue1")
public class DirectReceiver {
//处理消息
@RabbitHandler
public void process(Map map) {
System.out.println("DirectReceiver收到消息: " + map);
}
}