这一篇足够
一、direct exchange(直连型交换机)
只有提供者代码:
核心代码如下
@RestController
public class SendMessageController {
@Autowired
RabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法
// http://127.0.0.1:8007/sendDirectMessage
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "test message, hello,根据TestDirectRoutin路由key,找到交换机exchanger:MessageDirectExchange!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,Object> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime",createTime);
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
rabbitTemplate.convertAndSend("MessageDirectExchange", "TestDirectRouting", map);
return "ok";
}
}
postman 发送请求,返回ok。同时,没有被消费的信息如下,连续请求6次:
问题一:交换机如何和路由键值对, 一一匹配的呢,config代码如下。MessageDirectExchange交换机与
路由键值对TestDirectRouting绑定
@Configuration
public class DirectRabbitConfig {
//队列 起名:message-push-queue
@Bean
public Queue messagepushqueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("messagepushqueue",true);
}
//Direct交换机 起名:MessageDirectExchange
@Bean
DirectExchange MessageDirectExchange() {
// return new DirectExchange("TestDirectExchange",true,true);
return new DirectExchange("MessageDirectExchange",true,false);
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(messagepushqueue()).to(MessageDirectExchange()).with("TestDirectRouting");
}
}
上述返回了一个messagepushqueue
问题二:如何消费这部分信息呢
新建一个 工程,consum 消费端,监听messagepushqueue队列
@Component
@RabbitListener(queues = "messagepushqueue")//监听的队列名称 messagepushqueue
public class DirectReceiver {
@RabbitHandler
public void process(Map testMessage) {
String uuid =(String) testMessage.get("messageId");
System.out.println("DirectReceiver消费者收到队列messagepushqueue消息 : " + testMessage.toString());
System.out.println("消费,直连型交换机消费信息的uuid,可以根据这个做进一步的判断"+uuid);
}
}
参考文章: