true transaction example ejemplo driven annotation transactions spring-integration

transactions - example - spring transaction propagation



Mantener la transacción dentro del flujo de integración de Spring (2)

Si se trata de un MessagingGateway inyectado en su código, puede simplemente iniciar su transacción en la puerta de enlace y, dado que todos los canales son directos, todo el flujo se ejecutará en la misma transacción. Simplemente anote su método de puerta de enlace con @Transactional y agregue <tx:annotation-driven/> o @EnableTransactionManagement a su contexto (y un administrador de transacciones).

O puede comenzar su transacción incluso antes si quiere otras cosas en la transacción ...

@Transactional public void foo() { ... Object reply = myGateway.exchange(Object foo); ... }

Solo asegúrate de invocar a foo() desde otro bean para que la clase que contiene a foo() esté envuelta en un proxy de transacción (por @EnableTransactionManagement o <tx:annotation-driven/> ).

Si se trata de una puerta de enlace, como una puerta de enlace entrante http, agregue una puerta de enlace @Transaction al después de la puerta de enlace de entrada para iniciar la transacción. (Agregue un activador de servicio que ref sa <gateway/> que intercambia Message<?> Y se anota con @Transactional ).

Puerta de enlace de Inboud:

<int-http:inbound-gateway id="inbound.gateway" request-channel="transactional.channel.input" reply-channel="channel.output" error-channel="channel.error" request-payload-type="java.lang.String" </int-http:inbound-gateway>

Definición de consejo:

<tx:advice id="advice"> <tx:attributes> <tx:method name="send" propagation="REQUIRES_NEW" rollback-for="MyClassException"/> </tx:attributes> </tx:advice>

Configuración de asesoramiento:

<aop:config> <aop:advisor advice-ref="advice" pointcut="bean(transactional.channel.input)"/> </aop:config>

Cadena que debe ser transaccional:

<int:chain input-channel="transactional.channel.input" output-channel="non.transactional.channel.input> <int:service-activator ref="v1.registerUser.service" method="registerUser"/> <int:service-activator ref="v1.saveObject.service" method="saveObject"/> </int:chain>

Cadena que necesita que la transacción se ejecute previamente para obtener el ID de objeto generado en el último paso de la cadena transacional:

<int:chain input-channel="non.transactional.channel.input" output-channel="channel.output"> <int:service-activator ref="v1.getObjectId.service" method="getObjectId"/> <int:object-to-json-transformer/> </int:chain>

Teniendo este contexto simplificado, cuando accedo a la identificación en el servicio getObjectId, la transacción no se ha ejecutado.

Entonces, la transacción parece estar comprometida en el nivel de salida de la puerta de enlace de entrada.


Un truco más increíble sin escribir ningún código Java:

<channel id="input"/> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="bean(input)"/> </aop:config> <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="send"/> </tx:attributes> </tx:advice>

Con esto, todo su flujo de mensajes de singlethreaded directo se ajustará a la TX en el envío de mensajes a la entrada del canal