java / intermediate
Snippet
Nicht-blockierende Domain-Event-Verarbeitung mit @Async und @EventListener
Die Kombination von @EventListener mit @Async ermöglicht es Spring-Anwendungen, Domain-Events synchron aus der Geschäftslogik zu publizieren, während zeitintensive Nebeneffekte (wie der Versand von Benachrichtigungen) nebenläufig auf einem dedizierten Thread-Pool ausgeführt werden.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public record OrderCreatedEvent(Long orderId, String customerEmail) {}@Servicepublic class OrderNotificationListener {private final EmailClient emailClient;public OrderNotificationListener(EmailClient emailClient) {this.emailClient = emailClient;}@Async("notificationTaskExecutor")@EventListenerpublic CompletableFuture<Void> handleOrderCreated(OrderCreatedEvent event) {emailClient.sendOrderConfirmation(event.customerEmail(), event.orderId());return CompletableFuture.completedFuture(null);}}
spring
Erklärung
1
public record OrderCreatedEvent(Long orderId, String customerEmail) {}
Definiert einen unveränderlichen Datenträger, der die Zustandsänderungen für das Domain-Event kapselt.
2
@Async("notificationTaskExecutor")
Gibt an, dass die Listener-Methode asynchron auf der benannten benutzerdefinierten TaskExecutor-Bean ausgeführt werden soll.
3
@EventListener
Registriert diese Methode als Listener für Anwendungs-Events, die dem Parametertyp OrderCreatedEvent entsprechen.