Tag对同组同Topic的消费者有影响,当存在不同Tag的时候,会导致消费混乱,比如TagA的消息被TagB的消费者消费了
发送消息
yml 配置
spring:
cloud:
stream:
bindings:
# 生产者 发布告警信息
binding-rocketmq-producer-alert-info-notify:
destination: SPXJ_ALERT_INFO_NOTIFY
binder: binder-rocketmq
content-type: application/json
代码
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import javax.annotation.Resource;
@Slf4j
@EnableBinding(RocketMqProducerMessageSource.class)
public class NotifyAlertInfoProducer {
private static final String TAG_CLOCK_SYNC = "clock_sync";
@Resource
@Output(RocketMqProducerMessageSource.BINDING_PRODUCER_ALERT_INFO_NOTIFY)
private MessageChannel channel;
public void notifyAlertInfo(AlertInfo alertInfo) {
Message<AlertInfo> msg = MessageBuilder.withPayload(alertInfo)
.setHeader(RocketMQHeaders.TAGS, TAG_CLOCK_SYNC)
.build();
channel.send(msg);
}
}
接收消息
yml配置
spring:
cloud:
stream:
rocketmq:
# 设置相应的 tags, 多个使用 || 分割
bindings:
binding-rocket-consumer-alert-info-ntp-notify:
consumer:
tags: ntp
binding-rocket-consumer-alert-info-server-notify:
consumer:
tags: server
binding-rocket-consumer-alert-info-other-notify:
consumer:
tags: other
bindings:
binding-rocket-consumer-alert-info-ntp-notify:
destination: SPXJ_ALERT_INFO_NOTIFY
binder: binder-rocketmq
content-type: application/json
group: spxj-alert-info-ntp-receive
binding-rocket-consumer-alert-info-server-notify:
destination: SPXJ_ALERT_INFO_NOTIFY
binder: binder-rocketmq
content-type: application/json
group: spxj-alert-info-server-receive
binding-rocket-consumer-alert-info-other-notify:
destination: SPXJ_ALERT_INFO_NOTIFY
binder: binder-rocketmq
content-type: application/json
group: spxj-alert-info-other-receive
代码
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.Message;
@Slf4j
@EnableBinding(RocketMqCousumerSource.class)
public class AlertInfoNotifyListener {
/**
* 时钟告警
* @param message
*/
@StreamListener(RocketMqCousumerSource.BINDING_ROCKET_CONSUMER_ALERT_INFO_NTP_NOTIFY)
public void msgAlertInfoNtpNotifyConsumer(Message<byte[]> message) {
log.info("消息 TAG: {}", message.getHeaders().get(RocketMQHeaders.PREFIX + RocketMQHeaders.TAGS));
byte[] payload = message.getPayload();
log.info("接收到消息: {}", JacksonUtil.byteToObject(payload, AlertInfo.class));
}
/**
* 主机告警
* @param message
*/
@StreamListener(RocketMqCousumerSource.BINDING_ROCKET_CONSUMER_ALERT_INFO_SERVER_NOTIFY)
public void msgAlertInfoServerNotifyConsumer(Message<byte[]> message) {
log.info("消息 TAG: {}", message.getHeaders().get(RocketMQHeaders.PREFIX + RocketMQHeaders.TAGS));
byte[] payload = message.getPayload();
log.info("接收到消息: {}", JacksonUtil.byteToObject(payload, AlertInfo.class));
}
/**
* 其他告警
* @param message
*/
@StreamListener(RocketMqCousumerSource.BINDING_ROCKET_CONSUMER_ALERT_INFO_OTHER_NOTIFY)
public void msgAlertInfoOtherNotifyConsumer(Message<byte[]> message) {
byte[] payload = message.getPayload();
log.info("接收到消息: {}", JacksonUtil.byteToObject(payload, AlertInfo.class));
}
}
参考
:
RocketMq中消费者Tag对消息的影响
SpringCloud Stream整合RocketMQ实现消息发送与接收