java / expert
Snippet
Eventual Consistency mit TransactionalEventListener
Um sicherzustellen, dass externe Seiteneffekte (wie E-Mails) nur auftreten, wenn eine Transaktion erfolgreich committet wurde, verwendet man @TransactionalEventListener mit der Phase AFTER_COMMIT.
snippet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Servicepublic class UserProcessor {private final ApplicationEventPublisher publisher;@Transactionalpublic void registerUser(User user) {repository.save(user);publisher.publishEvent(new UserRegisteredEvent(user));}@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)public void handleUserRegistration(UserRegisteredEvent event) {emailService.sendWelcomeEmail(event.getUser());}}
spring
Erklärung
1
phase = TransactionPhase.AFTER_COMMIT
Gibt an, dass der Listener erst nach dem Commit der Transaktion ausgeführt werden soll.
2
publisher.publishEvent(...)
Versendet das Event innerhalb des aktuellen Transaktionskontexts.