2017-08-17 2 views
1

Ich habe mit RabbitMQ für cross-Service-Messaging gesucht. Ich war in der Lage, unsere Exchange/Queues/DLX usw. mithilfe von Spring-Anmerkungen zu konfigurieren. Beispiel (einfache) Warteschlange Hörer:Pflegen Sie correlationId durch RabbitMQ

@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()); 
} 

Ich bin mit Feder-cloud-Schnüffler correlationIds/traceIds zu erzeugen, die beibehalten werden, wenn HTTP-Anfragen mit anderen Diensten zu sprechen, so dass wir die angegebenen ID überall verfolgen die Protokolle unserer verschiedenen Microservices.

Während ich die aktuelle traceid bekommen kann und setzen Sie das in meine 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(); 
} 

ich nicht einen Weg finden, können die traceid im Empfangsverfahren einzustellen.

Googling bringt mich zu Spring-Cloud-Stream und Spring-Cloud-Stream-Starter-Kaninchen; Die Dokumentation scheint darauf hinzuweisen, dass es möglich ist, traceIds automatisch einzufügen/zu setzen, aber ich kenne Spring-Cloud-Stream überhaupt nicht und finde die Dokumentation nicht besonders hilfreich.

So würde ich Antworten Liebe auf die folgenden:

  • Mit SpanAdjuster oder Tracer etc; Kann ich die TraceId basierend auf dem Wert in meinem DTO festlegen?
  • Mit Spring-Cloud-Stream, kann ich die traceId automatisch einfügen/abrufen, und wo würde ich anfangen?

Antwort

0

So Incase jemand kommt über diese die Detektivin traceid Kontext zu setzen suchen, kamen wir auf die folgende Lösung:

@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); 
} 

Es sollte beachtet werden, dass die gesamte Dokumentation sagt, dass eine Spanne sein sollte geschlossen, sobald du damit fertig bist. Der obige Arbeitsabschnitt sollte mit einem try/catch/finally-Block umschlossen werden, um sicherzustellen, dass dieser geschlossen ist.

Alle Methoden, die mit dem noch geöffneten Bereich aufgerufen werden, erben die TraceId.

EDIT

ich auch sagen soll, scheint es die bessere Lösung, um den Frühling AMQP Bibliothek mit Feder Cloud-Strom zu ersetzen wäre; von dem, was ich sagen kann, sollte dies automatisch die traceId in Kaninchen Nachrichten (correlationId) und setzen Sie es auf der anderen Seite. Ich hatte jedoch keine Gelegenheit, dies zu testen.