Java 在SpringRabbit中,为什么brave会删除消息的标题?
在模块中,brave正在提取和删除标题,为什么 我研究了其他工具(Java 在SpringRabbit中,为什么brave会删除消息的标题?,java,spring,rabbitmq,spring-rabbit,zipkin,Java,Spring,Rabbitmq,Spring Rabbit,Zipkin,在模块中,brave正在提取和删除标题,为什么 我研究了其他工具(SpringWeb,httpclient,okhttp3,grpc,以及其他工具),但从不从原始消息中删除包含跟踪键/附加项的标题 删除标头会产生副作用,重试拦截器将尝试第二次处理消息,但这是因为brave在第一次重试时删除了标头,因此在随后的重试中找不到该标头。消息传递跟踪与典型的RPC跟踪在两个主要方面不同。因为它是不同的,与RPC相比并不是找到前进道路的最佳方式。我将在这里简要地提到这两件事,它们主要是在我就这个主题所做的讨
SpringWeb
,httpclient
,okhttp3
,grpc
,以及其他工具),但从不从原始消息中删除包含跟踪键/附加项的标题
删除标头会产生副作用,重试拦截器将尝试第二次处理消息,但这是因为
brave
在第一次重试时删除了标头,因此在随后的重试中找不到该标头。消息传递跟踪与典型的RPC跟踪在两个主要方面不同。因为它是不同的,与RPC相比并不是找到前进道路的最佳方式。我将在这里简要地提到这两件事,它们主要是在我就这个主题所做的讨论中
无论如何,我希望上下文能够回答您的问题,即使它不会改变代码当前所做工作的事实。@Andrain感谢您的回答和支持,它真的很有帮助 作为一种解决方法,我们需要将重试拦截器向下移动
@Bean
@Order
BeanPostProcessor reorderingSimpleRabbitListenerContainerFactory() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (SimpleRabbitListenerContainerFactory.class.isAssignableFrom(bean.getClass())) {
final Class<RetryOperationsInterceptor> retryInterceptor = RetryOperationsInterceptor.class;
Advice[] adviceChain = ((SimpleRabbitListenerContainerFactory) bean).getAdviceChain();
Arrays.sort(adviceChain, (o1, o2) -> {
if (o1.getClass().isAssignableFrom(retryInterceptor)) {
return 1;
}
if (o2.getClass().isAssignableFrom(retryInterceptor)) {
return -1;
}
return 0; // it is stable sort, so no worry
});
}
return bean;
}
};
}
@Bean
@命令
BeanPostProcessor重新排序SimpleRableBitListenerContainerFactory(){
返回新的BeanPostProcessor(){
@凌驾
公共对象后处理初始化后(对象bean、字符串beanName)抛出BeansException{
if(SimpleRableBitListenerContainerFactory.class.isAssignableFrom(bean.getClass())){
最终类retryInterceptor=RetryOperationsInterceptor.Class;
Advice[]adviceChain=((SimpleRableBitListenerContainerFactory)bean);
数组.排序(adviceChain,(o1,o2)->{
if(o1.getClass().isAssignableFrom(retryInterceptor)){
返回1;
}
if(o2.getClass().isAssignableFrom(retryInterceptor)){
返回-1;
}
返回0;//这是稳定排序,所以不用担心
});
}
返回豆;
}
};
}