目录
rabbitmq-直接交换模式
rabbitmq-广播模式- 路由
rabbitmq-广播模式- 交换机
rabbitmq-转发模式
rabbitmq-延迟消费 在【队列上】
rabbitmq-延迟消费 在【消息上】
源码地址:https://gitee.com/caiwang/rabbitmq-project
回顾:
rabbitmq-直接交换模式中我们大概已经知道了rabbitmq的基本原理,现在我们去创建 rabbitmq-广播模式- 路由模式
首先 我们在common中创建统一管理的交换机名称
SenderConfDirectExchangeCommon
public class SenderConfDirectExchangeCommon {
public static final String DIRECT_EXCHANGE = "direct_exchange";
public static final String DIRECT_QUEUE_A = "direct_queue_a";
}
在生产者【rabbitmq-receiver-project02】中 我们来创建交换机和路由
SenderConfDirectExchangeConfig:
@Configuration
public class SenderConfDirectExchangeConfig {
/**
* Direct Exchange – 处理路由键。
* 需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。
* 这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,
* 则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
* 适合用于消息的单播发送 ,交换机根据推送消息时的 routing key 和 队列的 routing key 判断消息应该推送到哪个队列
*/
@Bean(name = "directQueueA")
public Queue directQueueA() {
return QueueBuilder.durable(SenderConfDirectExchangeCommon.DIRECT_QUEUE_A).build();
}
/**
* 功能描述 创建 DirectExchange 路由键
* @return org.springframework.amqp.core.DirectExchange
* @author cailu
* @date 2020/3/31 21:30
*/
@Bean(name = "directExchange")
public DirectExchange directExchange() {
// 第一个参数 路由键 第二个参数 持久化 第三个参数 自动删除
return new DirectExchange(SenderConfDirectExchangeCommon.DIRECT_EXCHANGE, true, false);
}
/**
* 功能描述 绑定交换机
* @param queue 交换机
* @param directExchange 路由
* @return org.springframework.amqp.core.Binding
* @author cailu
* @date 2020/3/31 22:48
*/
@Bean
public Binding directBindingA(@Qualifier("directQueueA") Queue queue, DirectExchange directExchange) {
return BindingBuilder.bind(queue).to(directExchange).with(SenderConfDirectExchangeCommon.DIRECT_QUEUE_A);
}
}
这里注意:
Direct Exchange – 处理路由键。
* 需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。
* 这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,
* 则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
* 适合用于消息的单播发送 ,交换机根据推送消息时的 routing key 和 队列的 routing key 判断消息应该推送到哪个队列
创建消息模板【SenderConfDirectExchangeTemplate】
SenderConfDirectExchangeTemplate:
@Component
public class SenderConfDirectExchangeTemplate {
@Autowired
private AmqpTemplate rabbitTemplate;
public void sendDirectExchangeA(String str) {
if ("".equals(str) || str == null) {
rabbitTemplate.convertAndSend(SenderConfDirectExchangeCommon.DIRECT_EXCHANGE,
SenderConfDirectExchangeCommon.DIRECT_QUEUE_A, " 广播模式 Direct Exchange bbb 路由");
} else {
rabbitTemplate.convertAndSend(SenderConfDirectExchangeCommon.DIRECT_EXCHANGE,
SenderConfDirectExchangeCommon.DIRECT_QUEUE_A, str);
}
}
}
创建controller演示类
SenderConfDirectExchangeController:
@Api(value = "10002-Direct 广播模式", tags = {"10002-Direct 广播模式"})
@RestController
public class SenderConfDirectExchangeController {
@Autowired
private SenderConfDirectExchangeTemplate template;
@GetMapping("sendDirectExchange")
@ApiOperation(value = "30001-创建 Direct 广播模式 发布者", notes = "创建 Direct 广播模式 发布者")
@ApiVersions(group = ApiVersionConstant.FAP_APP100)
public String sendDirectExchange(@ApiParam(value = "自定义发送能容") @RequestParam(value = "str") String str) {
template.sendDirectExchangeA(str);
return "广播模式 Direct Exchange 路由 创建成功!";
}
}
最后我们启动项目
在MQ后台 我们可以看见启动之后 就创建了EXchanges和queues
接下来 我们进行演示:
启动项目之后,浏览器 访问:http://localhost:8683/doc.html
发送一条请求之后 可以看到MQ后台已经有了一条等待消费的消息,
现在我们来创建消费者
在消费者【rabbitmq-receiver-project02】中我们创建类:
SenderConfDirectExchangeReceiver:
@Component
public class SenderConfDirectExchangeReceiver {
@RabbitListener(queues = SenderConfDirectExchangeCommon.DIRECT_QUEUE_A)
public void processQueue(String str) {
System.out.println(SenderConfDirectExchangeCommon.DIRECT_QUEUE_A + ":=============" + str.toString());
}
}
最后我们启动消费者,观察日志:
看到 这里马上就被消费掉了
至此 rabbitmq-广播模式- 路由完毕
源码地址:https://gitee.com/caiwang/rabbitmq-project
下一篇: rabbitmq-广播模式- 交换机