Конечная точка проста: контроллер принимает список сообщений для отправки во внешний API-интерфейс отдыха, который я не могу контролировать. Обработка на их стороне занимает очень много времени.
Полезная нагрузка выглядит так: это всего лишь пример, представьте себе много-много внутренних сообщений.
Код: Выделить всё
[
"somefirst message",
"some second message",
"etc"
]
Код: Выделить всё
@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";
}
Код: Выделить всё
@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);
});
});
}
В обычном цикле for мы увидим что-то вроде этого, своего рода каскад
Код: Выделить всё
for (String message : messages) {
messageProducer.sendMessage("topic-loom", message);
}

При использовании ткацкого станка проекта, виртуального потока (первая конструкция) или согласованной карты собирателей (второй подход) я ожидал увидеть что-то подобное (пожалуйста, поправьте меня, если я ошибаюсь). Что-то вроде "не каскад, а более параллельно".

Однако при обоих подходах возникает проблема со следами. Он показывает что-то очень странное с родителем.

< /p>
Вопрос:
Как правильно отобразить нечто похожее на цикл (первое изображение), где всего два уровня, основная задача и все параллель проходит?
Подробнее здесь: https://stackoverflow.com/questions/792 ... micrometer
Мобильная версия