在RocketMQ代码实战(一):使用rocketmq-spring-boot-starter发送和消费消息 讲解了使用rocketmq-spring-boot-starter快速搭建生产者消费者服务,本次继续讲解 发送带Tag的消息
Tag(标签)可以看作子主题,它是消息的第二级类型。同一业务模块不同目的的消息就可以用相同 Topic 而不同的 Tag来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有 Tag。
1.发送消息
@RestController
public class RocketMqController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@GetMapping("sendMqWithTag")
public Object sendMqWithTag() {
MqMessage message = MqMessage.builder().name("tag消息").msg("这是tag消息").build();
SendResult sendResult = rocketMQTemplate.syncSend(MqUtil.tag_topic+ ":" + MqUtil.tag, message);
return sendResult;
}
}
其他常量如下
public class MqUtil {
public static final String tag_topic = "tag_topic";
public static final String tag = "tag";
}
可见通过 RocketMQTemplate发送带Tag的消息,只需要将topic和tag中间通过【:】冒号连接即可
2.消费消息
@Slf4j
@Component
@RocketMQMessageListener(
topic = MqUtil.tag_topic,
selectorType = SelectorType.TAG,
selectorExpression = MqUtil.tag,//指定了tag后,发送的消息如果不带tag,将会消费不到
consumerGroup = "tag_consumer_group")
public class TagMsgListener implements RocketMQListener<MqMessage> {
@Override
public void onMessage(MqMessage message) {
log.info("{}收到消息:{}", this.getClass().getSimpleName(), message);
}
}
启动后,访问:http://127.0.0.1:8080/sendMqWithTag 控制台打印日志:
TagMsgListener收到消息:MqMessage(name=tag消息, msg=这是tag消息)
可见:
通过selectorType属性指定消费的选择类型为Tag,这个类型也是selectorType属性的默认值
通过selectorExpression属性来选择消费的Tag。默认是"*",即会消费该topic下所有的Tag的消息。
需要注意的是:
1.如果我们的消费者指定了消费的Tag后,发送的消息如果不带tag,将会消费不到;
2.如果我们的生产者指定了Tag,但是消费者的selectorExpression没有设置,即用默认的“*”,那么这个消费者也会消费到。