Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过RabbitMQ维护correlationId_Java_Spring_Rabbitmq_Spring Amqp_Spring Cloud Stream - Fatal编程技术网

Java 通过RabbitMQ维护correlationId

Java 通过RabbitMQ维护correlationId,java,spring,rabbitmq,spring-amqp,spring-cloud-stream,Java,Spring,Rabbitmq,Spring Amqp,Spring Cloud Stream,我一直在考虑使用RabbitMQ进行跨服务消息传递。我已经能够使用Spring注释配置我们的Exchange/Queues/DLX等。示例(简单)队列侦听器: @RabbitListener(queues = RabbitMessageType.QueueNames.SMS_NOTIFICATIONS) public void receive1(Message message) throws Exception { RabbitMessageDto messageDto = OBJECT

我一直在考虑使用RabbitMQ进行跨服务消息传递。我已经能够使用Spring注释配置我们的Exchange/Queues/DLX等。示例(简单)队列侦听器:

@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());
}
我正在使用spring cloud sleuth生成CorrelationID/TraceID,这些ID在使用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的方法

谷歌一直把我带到春云流和春云流;文档似乎表明可以自动插入/设置TraceID,但我对SpringCloudStream一点也不熟悉,也不觉得文档特别有用

因此,我希望得到以下问题的答案:

  • 使用翼展调节器或跟踪器等;我可以根据DTO中的值设置traceId吗
  • 使用SpringCloudStream,我可以自动插入/检索traceId吗?从哪里开始

因此,如果有人在设置sleuth 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 work部分应该用try/catch/finally块包装,以确保该部分已关闭

在span仍然打开的情况下调用的任何方法都将继承traceId

编辑


我还应该说,似乎更好的解决方案是用SpringCloudStream替换SpringAMQP库;据我所知,这应该在兔子消息(correlationId)中自动包含traceId,并将其设置在另一端。但是,我还没有机会对此进行测试。

因此,如果有人在设置sleuth 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 work部分应该用try/catch/finally块包装,以确保该部分已关闭

在span仍然打开的情况下调用的任何方法都将继承traceId

编辑

我还应该说,似乎更好的解决方案是用SpringCloudStream替换SpringAMQP库;据我所知,这应该在兔子消息(correlationId)中自动包含traceId,并将其设置在另一端。然而,我还没有机会测试这个