目录
rabbitmq-直接交换模式
rabbitmq-广播模式- 路由
rabbitmq-广播模式- 交换机
rabbitmq-转发模式
rabbitmq-延迟消费 在【队列上】
rabbitmq-延迟消费 在【消息上】
源码地址:https://gitee.com/caiwang/rabbitmq-project
现在来介绍一下 Topic转发模式
在common中创建:
SenderConfTopicCommon
public class SenderConfTopicCommon {
public static final String DIRECT_TOPIC_MESSAGE = "topic.message";
public static final String DIRECT_TOPIC_TO_MESSAGE = "topic.to.message";
public static final String DIRECT_TOPIC_MESSAGE_EXCHANGE = "topic_exchange";
public static final String TOPIC_MESSAGES = "messages";
}
在项目【rabbitmq-sender-project04】中创建:
SenderConfTopicConfig:
@Configuration
public class SenderConfTopicConfig {
@Bean
public Queue queueMessage() {
return new Queue(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE);
}
@Bean(name = SenderConfTopicCommon.TOPIC_MESSAGES)
public Queue queueMessages() {
return new Queue(SenderConfTopicCommon.DIRECT_TOPIC_TO_MESSAGE);
}
@Bean
public TopicExchange exchange() {
return new TopicExchange(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE_EXCHANGE);
}
@Bean
Binding bindingExchangeMessage() {
return BindingBuilder.bind(queueMessage()).to(exchange()).with(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE);
}
/**
* 说明:绑定交换机
* *(星号):可以(只能)匹配一个单词
* #(井号):可以匹配多个单词(或者零个)
* Title: bindingExchangeMessages
* @param queue 交换机
* @param exchange 需要绑定的交换机
* @return
*/
@Bean
Binding bindingExchangeMessages(@Qualifier(SenderConfTopicCommon.TOPIC_MESSAGES) Queue queue,
TopicExchange exchange) {
// *表示一个词,#表示零个或多个词*.email *.user
//由queueMessages绑定exchange 交换机,与【 topic.#】规则匹配的 全部消息都路由到exchange上
//例如 topic.# 能够匹配到“topic.irs.corporate” 但是“topic.*” 只会匹配到“topic.irs”
return BindingBuilder.bind(queue).to(exchange).with("topic.#");
}
}
创建模板
SenderConfTopicTemplate
@Component
public class SenderConfTopicTemplate {
@Autowired
private AmqpTemplate template;
/**
* 功能描述
* @param str 内容
* @return void
* @author cailu
* @date 2020/4/1 14:14
*/
public void sendTopictemplate(String str) {
if ("".equals(str) || str == null) {
template.convertAndSend(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE_EXCHANGE,
SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE, "hello,Topic转发模式");
} else {
template.convertAndSend(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE_EXCHANGE,
SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE, str);
}
}
/**
* 功能描述 指定的转发到目标 路由器
* @param str 内容
* @return void
* @author cailu
* @date 2020/4/1 14:14
*/
public void sendTopicToMestemplate(String str) {
if ("".equals(str) || str == null) {
template.convertAndSend(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE_EXCHANGE,
SenderConfTopicCommon.DIRECT_TOPIC_TO_MESSAGE, "hello,Topic转发模式");
} else {
template.convertAndSend(SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE_EXCHANGE,
SenderConfTopicCommon.DIRECT_TOPIC_TO_MESSAGE, str);
}
}
}
创建controller
SenderConfTopicController
@Api(value = "10002-Topic 转发模式", tags = {"10002-Topic 转发模式"})
@RestController
public class SenderConfTopicController {
@Autowired
private SenderConfTopicTemplate senderConfTopicTemplate;
/**
* 功能描述 指定转发的路由
* @param str WATCHER_ALARMS
* @return java.lang.String
* @author cailu
* @date 2020/4/1 14:18
*/
@GetMapping("sendTopictemplate")
@ApiOperation(value = "20001-创建 Topic转发模式 发布者", notes = "创建 Topic转发模式 发布者")
@ApiVersions(group = ApiVersionConstant.FAP_APP100)
public String sendTopictemplate(@ApiParam(value = "自定义发送能容") @RequestParam(value = "str") String str) {
senderConfTopicTemplate.sendTopictemplate(str);
return "Topic转发模式 创建成功!";
}
/**
* 功能描述 指定到转发的路由
* @param str
* @return java.lang.String
* @author cailu
* @date 2020/4/1 14:15
*/
@GetMapping("sendTopicToMestemplate")
@ApiOperation(value = "20002-创建指定到转发的路由", notes = "指定到转发的路由")
@ApiVersions(group = ApiVersionConstant.FAP_APP100)
public String sendTopicToMestemplate(@ApiParam(value = "自定义发送能容") @RequestParam(value = "str") String str) {
senderConfTopicTemplate.sendTopicToMestemplate(str);
return "Topic转发模式 指定到转发的路由 创建成功!";
}
}
说明:
sendTopictemplate中创建的是由:topic_exchange进行广播的,这个是在本queues中存在
sendTopicToMestemplate是经过了多成转发,是由绑定的topic_exchange进行路由,在queues转发
转发规则是按照:
【*】表示一个词,【#】表示零个或多个词【*.email *.user】
由queueMessages绑定exchange 交换机,与【 topic.#】规则匹配的 全部消息都路由到exchange上
例如 topic.# 能够匹配到“topic.irs.corporate” 但是“topic.*” 只会匹配到“topic.irs”
也是是我们上文代码中的:
@Bean
Binding bindingExchangeMessages(@Qualifier(SenderConfTopicCommon.TOPIC_MESSAGES) Queue queue,
TopicExchange exchange) {
// *表示一个词,#表示零个或多个词*.email *.user
//由queueMessages绑定exchange 交换机,与【 topic.#】规则匹配的 全部消息都路由到exchange上
//例如 topic.# 能够匹配到“topic.irs.corporate” 但是“topic.*” 只会匹配到“topic.irs”
return BindingBuilder.bind(queue).to(exchange).with("topic.#");
}
创建消费者
在项目【rabbitmq-receiver-project04】中创建
SenderConfTopicReceiver
@Component
public class SenderConfTopicReceiver {
@RabbitListener(queues = SenderConfTopicCommon.DIRECT_TOPIC_MESSAGE)
public void processTopicQueue(String str) {
System.out.println("Receive---topic_message:========================:" + str.toString());
}
@RabbitListener(queues = SenderConfTopicCommon.DIRECT_TOPIC_TO_MESSAGE)
public void processTopicToeMSQueue(String str) {
System.out.println("Receive---由topic_message转发到topic_to_message:========================:" + str.toString());
}
}
同时启动生产者 和消费者
观察mq后台变化和 消费者日志
至此rabbitmq-转发模式完毕