To synchronize RabbitMQ and SQL Server within a external client transaction:
1. configure a PlatformTransactionManager
2. set the "channelTransacted" flag to true in the RabbitTemplate and/or provide the "transactionManager" to the SimpleMessageListenerContainer.
Spring conf:
Code:
<!-- JpaTransactionManager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />
<!-- RabbitTemplate -->
<rabbit:template id="amqpTemplate"
connection-factory="connectionFactory"
channel-transacted="true" />
<!-- SimpleMessageListenerContainer -->
<rabbit:listener-container connection-factory="connectionFactory" transaction-manager="transactionManager" >
<rabbit:listener queues="some.queue" ref="messageHandler" method="handle"/>
</rabbit:listener-container>
Your code:
Code:
......
@PersistenceContext
private EntityManager em;
@Inject
private AmqpTemplate amqpTemplate;
@Transactional
public void insertRowAndSendMessage() {
//entity
User user = new User();
user.setFirstName( "nicolas" );
user.setLastName( "loriente" );
em.persist( user ); // database operation
amqpTemplate.convertAndSend( "some.queue", user ); // amqp broker operation
}
..........
I'm omitting service and repository classes for simplicity but the example above is fully functional and will get your transaction synchronization.
You can read about it on the Transactions section of the Spring AMQP Reference Documentation (http://static.springsource.org/sprin...e/html/#d0e734)
nicolas.loriente