@startuml Messaging Sequenzdiagramm Links group "Backend: Request produzieren und warten" Endpoint -> RequestReply: request(cmdW) RequestReply -> AtomicReference : <> RequestReply <-- AtomicReference : responseRef RequestReply -> RequestReply : responses.put(\nrequestId,\nresponseRef) RequestReply -> Kafka: produce(cmdW) RequestReply <-- Kafka : Ack RequestReply -> AtomicReference : wait() end note over Kafka : asynchron group "Persistence: Request konsumieren und enqueuen" Quarkus -> Kafka: poll() Quarkus <-- Kafka: cmdW Quarkus -> CommandObserver: process(cmdW) CommandObserver -> Transaction: get(txId) CommandObserver <-- Transaction: tx CommandObserver -> Transaction: queue(tx, cmdW) CommandObserver <-- Transaction Quarkus <-- CommandObserver Kafka <-- Quarkus : Ack end note over Transaction : asynchron ... Persistence: Request verarbeiten und Response produzieren\n(siehe weiteres Sequenzdiagramm) ... note over Kafka : asynchron group "Backend: Response konsumieren und benachrichtigen" RequestReply -> Kafka : poll() RequestReply <-- Kafka : respW RequestReply -> RequestReply : responses.get(requestId) RequestReply -> AtomicReference : set(respW) RequestReply <-- AtomicReference RequestReply -> AtomicReference : notifyAll() RequestReply <-- AtomicReference end note over RequestReply : asynchron group "Backend: Response zu Request zurückgeben" [synchron nach 1. Block, siehe oben] RequestReply <-- AtomicReference : wegen wait (siehe oben) RequestReply -> AtomicReference : get() RequestReply <-- AtomicReference : respW Endpoint <-- RequestReply : respW end @enduml