问题描述
我刚开始将OpenTracing与Jaeger Cloud启动器一起使用。为此,我在项目中添加了以下依赖项:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.1.2</version>
</dependency>
opentracing-spring-messaging 项目的 io.opentracing.contrib.spring.integration.messaging.OpenTracingChannelInterceptor 将范围(ThreadLocalScope)添加到消息头。
Solace活页夹输出消息处理程序仅支持作为Serializable实例的标头值。 因此,它开箱即用。 我围绕此消息处理程序实现了一个方面,如下所示(只是其中的一部分):
final MessageTextMap messageTextMap = new MessageTextMap(message);
tracer.inject(span.context(),Builtin.TEXT_MAP,messageTextMap);
messageTextMap.addHeader(OpenTracingChannelInterceptor.class.getName() + ".ScopE",""); // with this I'm removing the ThreadLocalScope
使用此技巧即可。 避免这种黑客入侵的正确方法是什么?
更新:
public class SolaceMessageTextMap<T> implements TextMap {
private final MessageTextMap<T> delegate;
public SolaceMessageTextMap(final Message<T> message) {
final Message<T> filteredMessage = filteredMessage(message);
delegate = new MessageTextMap<>(filteredMessage);
}
@Override
public Iterator<Entry<String,String>> iterator() {
return delegate.iterator();
}
@Override
public void put(final String key,String value) {
delegate.put(key,value);
}
public Message<T> getMessage() {
return delegate.getMessage();
}
private Message<T> filteredMessage(final Message<T> message) {
return MessageBuilder.withPayload(message.getPayload())
.copyHeaders(filteredHeaders(message.getHeaders()))
.build();
}
private Map<String,Object> filteredHeaders(final MessageHeaders headers) {
return headers.entrySet().stream()
.filter(entry -> isValid(entry.getValue()))
.collect(Collectors.toMap(Entry::getKey,Entry::getValue));
}
private boolean isValid(final Object value) {
return value instanceof Serializable;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)