2017-08-17 34 views
1

我一直在寻找使用RabbitMQ进行跨服务消息传递。我已经能够使用Spring注释来配置Exchange/Queues/DLX等。示例(简单)队列监听:通过RabbitMQ维护correlationId

@RabbitListener(queues = RabbitMessageType.QueueNames.SMS_NOTIFICATIONS) 
public void receive1(Message message) throws Exception { 
    RabbitMessageDto messageDto = OBJECT_MAPPER.readValue(message.getBody(), RabbitMessageDto.class); 
    SmsNotificationDto payload = OBJECT_MAPPER.readValue(messageDto.getPayload(), SmsNotificationDto.class); 
    log.info(payload.getMessage()); 
} 

我使用的是弹簧云侦探产生correlationIds/traceIds,这是使用HTTP请求时跟其他服务保存下来,使我们能够在整个跟踪给定ID我们各种微服务的日志。

虽然我可以得到当前traceId并插入到我的DTO:

@Autowired 
private Tracer tracer; 

private RabbitMessageDto createRabbitMessageWithPayload(String messageType, 
                 String messageVersion, 
                 Object payload) { 
    return new RabbitMessageDto.Builder() 
     .withTraceId(tracer.getCurrentSpan().getTraceId()) 
     .withDtoName(messageType) 
     .withDtoVersion(messageVersion) 
     .withPayload(payload) 
     .build(); 
} 

我不能找到一种方法来设置接收方法的traceId。

谷歌搜索不断给我带来春季云流和春季云流首发 - 兔;文档似乎表明它可能会自动插入/设置traceIds,但我对Spring-Cloud-Stream完全不熟悉,并且没有找到特别有用的文档。

所以,我很想回答以下几个:

  • 使用SpanAdjuster或示踪等;我可以根据我的DTO中的值设置traceId吗?
  • 使用spring-cloud-stream,我可以自动插入/检索traceId,我将从哪里启动?

回答

0

所以,柜面有人遇到这种期待以设置侦探traceId背景下,我们提出了以下解决方案:

@Autowired Tracer tracer; 

private void someMethod(long traceId) { 
    Span span = Span.builder() 
     .traceId(traceId) 
     .spanId(new Random().nextLong()) 
     .build(); 
    tracer.continueSpan(span); 
    // do work 
    tracer.closeSpan(span); 
} 

应当注意的是,所有的文件说,一个跨度应该是完成后关闭。上面的do工作部分应该用try/catch/finally块包装以确保关闭。

任何使用跨度仍然打开的方法将继承traceId。

编辑

我还应该说,这似乎更好的解决办法是更换弹簧AMQP库弹簧云流;从我所知道的情况来看,这应该会自动在rabbit消息中包含traceId(correlationId)并将它设置在另一端。但是,我没有机会测试这个。