Open texousliu opened 1 year ago
我觉得这是一个比较重要的功能,在获取消息之后能够全局拦截并预先处理。比如说:需要全链路追踪的时候,可以通过这个扩展拦截器处理额外的信息到 context 中
因为我在 starter 的源代码中没有看到相关的扩展接口,如果需要强制实现的话需要重写 ListenerContainerConfiguration
,我认为这是不太友好的方式
写的不错,很有想法。
个人认为,作者没有实现扩展接口,可能另有考虑。
另外,如果要针对rocketMQ实现链路追踪,需要生产者在发送消息时,通过properties
增加对应值。在消费者端,使用aop进行处理,也很方便
下面是我的代码示例
`@Slf4j @Aspect @Component public class TraceAspect {
private static final String TRACE_ID = "traceId";
@SneakyThrows
@Around("@annotation(mqTraceID)")
public Object before2(ProceedingJoinPoint joinPoint, MqTraceID mqTraceID) {
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if (arg instanceof MessageExt messageExt) {
Map<String, String> properties = messageExt.getProperties();
String traceId = properties.get(TRACE_ID);
if (StringUtils.isBlank(traceId)) {
traceId = generateTraceId();
}
MDC.put(TRACE_ID, traceId);
break;
}
}
try {
return joinPoint.proceed();
} finally {
MDC.clear();
}
}
public static String generateTraceId() {
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
}`
消费者
Component
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "test-consumer-group")
public class BuyRenewCloudDiskMq implements RocketMQListener
}
}
因为我在 starter 的源代码中没有看到相关的扩展接口,如果需要强制实现的话需要重写
ListenerContainerConfiguration
,我认为这是不太友好的方式
太需要这个了,不然就只能自己定制处理
可以写个父类,实现RocketMQListene\<MessageExt>,可以自定义消费逻辑
ocketMQ实现链路追踪,需要生产者在发送消息时,通过
properties
增加对应值。在消费者端,使
这样就需要修改旧代码了,如果从源头可扩展支持,那么我可以不用动旧代码
可以写个父类,实现RocketMQListene
,可以自定义消费逻辑
旧代码需要改造,新代码需要约束开发者行为,如果不知情的同事还是回使用原生注解
ref https://github.com/apache/rocketmq-spring/issues/616
只要这个方法改成public,就可以通过切面DefaultRocketMQListenerContainer 来做统一的处理了。
FEATURE REQUEST
import org.apache.rocketmq.common.message.MessageExt;
/**
@since 2023-08-18 */ public interface RocketMQListenerMessageCustomizer {
void customize(final MessageExt messageExt);
}
DefaultRocketMQListenerContainer 添加