0 Tage Serie
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) {}
@Service
public class OrderNotificationListener {
private final EmailClient emailClient;
public OrderNotificationListener(EmailClient emailClient) {
this.emailClient = emailClient;
}
@Async("notificationTaskExecutor")
@EventListener
public 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.