Ich verwende Spring-Anwendungsereignisse innerhalb meiner Service-Schicht, um das breitere System zu benachrichtigen, wenn bestimmte Ereignisse auftreten. Das Problem, das ich habe, ist, dass die Ereignisse in einem transaktionalen Kontext ausgelöst werden (ich verwende Spring @Transactional
Annotation). Die Gefahr besteht darin, dass ich ein Ereignis auslöst und dann die Transaktion beim Commit fehlschlägt (dies kann beispielsweise bei Verwendung von Hibernate passieren). In diesem Szenario gehen die Ereignis-Listener von einem Zustand aus, der nach der Ausführung zurückgesetzt wird. Die Gefahr besteht hier darin, dass ich beispielsweise eine E-Mail gesendet habe, um die Registrierung eines Nutzers auf einer Website zu bestätigen, obwohl sein Benutzerkonto tatsächlich nicht erstellt wurde.Spring Transaction Annotationen - Execute on Success
Gibt es eine Möglichkeit, unter Beibehaltung der Verwendung von Anmerkungen, irgendwo ein Ereignis zu markieren, das nach der Transaktion ausgelöst werden soll? Es scheint irgendwie analog zu SwingUtilities.invokeLater(Runnable runnable)
bei GUI-Programmierung in Java Swing. Ich möchte sagen, führen Sie dieses Bit des Codes später aus, sobald die aktuelle Transaktion erfolgreich festgeschrieben wird.
Irgendwelche Ideen?
Danke,
Andrew
Dies alles über Annotationen nativ im Frühjahr jetzt gehandhabt wird. Siehe https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2https://spring.io/blog/2015/02/11/besser -application-events-in-spring-framework-4-2 speziell für den Abschnitt über die neue Annotation @TransactionalEventListener. – PaulNUK