Tengo una aplicación de marco de resorte en la que me gustaría agregar un oyente de transacción a una transacción que está actualmente en progreso. La motivación es activar una acción posterior a la confirmación que notifique a los sistemas posteriores. Estoy usando @Transactional para ajustar una transacción en torno a algún método de servicio, que es donde quiero crear/registrar el oyente de transacción posterior. Quiero hacer algo como "me gusta" lo siguiente.registra dinámicamente el detector de transacciones con spring?
public class MyService {
@Transaction
public void doIt() {
modifyObjects();
// something like this
getTransactionManager().registerPostCommitAction(new
TransactionSynchronizationAdapter() {
public void afterCommit() {
notifyDownstream();
}
});
}
}
Spring tiene una interfaz TransactionSynchronization y clase de adaptador que parece exactamente lo que quiero; sin embargo, no está claro cómo registrar uno dinámicamente con la transacción actual o con el administrador de transacciones. Prefiero no subclasificar JtaTransactionManager si puedo evitarlo.
Q: Alguien ha hecho esto antes.
Q: ¿Cuál es la forma más sencilla de registrar mi adaptador?
Una buena sugerencia, sin embargo, ¿esto no se ejecutará en ninguna transacción? Solo quiero una finalización completa. Además, ¿puedo usar esas anotaciones AOP con resorte predeterminado (no estoy usando código tejiendo) solo proxies JDK. – Justin
El aviso de devolución no se ejecuta cuando los métodos arrojan una excepción, por lo que esto se basa en la confirmación @Transactional cuando el método devuelve el resultado y retrocede al lanzar la excepción, que generalmente es lo que sucede. Los aspectos se llaman a través de proxies dinámicos de resortes, por lo que no hacen ningún tipo de código (a menos que no se proporcionen interfaces para el proxy al principio, donde la primavera volverá a tejer el código en tiempo de ejecución con cglib). – krock
+1 por interesante, pero aún no estoy convencido sin probar. Hay al menos 2 @AfterReturning involucrados: @Transactional y luego mi aspecto personalizado. Si @Transactional se ejecuta, entonces la mía se ejecuta, todo está bien; sin embargo, en el otro orden, ejecutaré antes, independientemente del estado de confirmación de transacción. – Justin