Der Endpunkt ist unkompliziert, der Controller akzeptiert eine Liste von Nachrichten, die an eine externe Rest-API gesendet werden, über die ich keine Kontrolle habe. Die Verarbeitung auf ihrer Seite dauert sehr lange.
Die Nutzlast sieht so aus, dies ist nur ein Beispiel, stellen Sie sich bitte viele, viele innere Nachrichten vor.
Code: Select all
[
"somefirst message",
"some second message",
"etc"
]
Code: Select all
@PostMapping("/question2")
public String question2(@RequestBody List messages) {
Observation parent = Observation.createNotStarted("parent", registry);
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (String message : messages) {
parent.observe(() -> {
ContextExecutorService.wrap(executor,
() -> ContextSnapshotFactory.builder().build().captureAll())
.submit(() -> {
Observation.createNotStarted("child" + message, registry).observe(() -> {
messageProducer.sendRequest("topic-loom-micrometer",
message + Thread.currentThread().getName());
});
});
});
}
executor.shutdown();
}
return "it seems everything went fine";
}
Code: Select all
@PostMapping("/question3")
public List question3(@RequestBody List messages) {
Observation parent = Observation.createNotStarted("parent", registry);
return messages.stream()
.gather(Gatherers.mapConcurrent(messages.size() + 1, oneMessage -> sendRequestInParallel(oneMessage, parent)))
.toList();
}
private String sendRequestInParallel(String oneMessage, Observation parent) {
return parent.observe(() -> {
return Observation.createNotStarted("child" + oneMessage, registry).observe(() -> {
return restClient.post()
.uri("http://localhost:8081/justString?name=" + oneMessage)
.retrieve()
.body(String.class);
});
});
}
In einer einfachen alten for-Schleife würden wir so etwas sehen, eine Art Kaskade
Code: Select all
for (String message : messages) {
messageProducer.sendMessage("topic-loom", message);
}

Bei Project loom, dem virtuellen Thread (erstes Konstrukt) oder dem Gatherers MapConcurent (zweiter Ansatz) hätte ich erwartet, so etwas zu sehen (bitte korrigieren Sie mich, wenn ich falsch liege). Etwas wie „keine Kaskade, sondern paralleler“.

Kurz gesagt, das ist es, was ich erwarte:
[img]https:/ /i.sstatic.net/oTtpxpyA.png[/img]
Bei beiden Ansätzen scheint es jedoch ein Problem mit den Spuren zu geben. Es zeigt etwas sehr Seltsames mit dem übergeordneten Element.
Dies ist das tatsächliche Ergebnis:

Frage:
Wie zeige ich etwas Ähnliches wie die Schleife richtig an ( erstes Bild), wo es nur zwei Ebenen gibt, die Hauptaufgabe und alle Parallelen läuft?