部署demo项目
通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T
注意 生产者消费者的yml文件也要配置好
什么是Direct交换机
Direct 交换机是 AMQP(高级消息队列协议)中的一种交换机类型,它根据消息的路由键(Routing Key)将消息发送到与之完全匹配的队列上。只有绑定到 Direct 交换机时指定了相同路由键的队列才会接收到消息。
在使用 Direct 交换机时,生产者将消息发送到 Direct 交换机,并指定一个特定的路由键。Direct 交换机会根据消息的路由键将消息发送到与之完全匹配的队列上。如果多个队列的路由键与消息的路由键完全匹配,则消息会被发送到多个队列中。
Direct 交换机常用于需要一对一通信的场景,例如任务分发、日志分类等。通过合理设置路由键,可以将消息准确地发送到目标队列,实现灵活的消息路由和处理。
Direct 交换机的特点包括:
- 精确路由:Direct 交换机根据消息的路由键进行精确匹配,只将消息发送到与之完全匹配的队列上。
- 灵活性:生产者可以通过设置消息的路由键来控制消息被发送到哪个队列。
- 一对一通信:每个消息只能被一个消费者接收。
实现Direct交换机
1.控制台
创建两个消息队列
创建direct交换机
绑定消息队列
如图 绑定的同时设置Routing key
queue1 queue2都有red,则等下 生产者发送Routing key = red 的消息时,两个队列都会收到这个消息
相反 bule,yellow都是各自独有的,则等下 发送时之后有一个消息队列能够接收到
2.编写消费者方法
package cn.itcast.mq.lintener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MQListener {
@RabbitListener(queues = "direct.queue1")
public void listenDirectQueue1(String message) {
log.info("消费者1收到了消息:........... {}", message);
// System.out.println("消费者收到了消息: " + message);
}
@RabbitListener(queues = "direct.queue2")
public void listenDirectQueue2(String message) {
log.info("消费者2收到了消息: {}", message);
// System.out.println("消费者收到了消息: " + message);
}
}
3.编写生产者测试方法
package cn.itcast.mq.helloworld;
import org.apache.logging.log4j.message.Message;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.converter.StringMessageConverter;
@SpringBootTest
public class SpringAMQPTest {
@Autowired
private RabbitTemplate rabbitTemplate;
// direct交换机
@Test
void testDirectExchange(){
String exchangeName = "hmall.direct";
String message1 = "hello, red 1111";
String message2 = "bule ddddd";
String message3 = "yello ttttt";
rabbitTemplate.convertAndSend(exchangeName,"red",message1);
rabbitTemplate.convertAndSend(exchangeName,"bule",message2);
rabbitTemplate.convertAndSend(exchangeName,"yellow",message3);
}
}
实验结果
消费者12 都能收到red
消费者1收到bule
消费者2收到yellow
实现成功