rabbitmq + Spring boot 整合-转发模式(04)

目录
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-转发模式完毕

源码地址:https://gitee.com/caiwang/rabbitmq-project

下一篇:rabbitmq-延迟消费 在【队列上】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值