Ich habe eine Spring-Anwendung, die Hibernate und PostgreSQL verwendet. Es verwendet auch Spring AMQP (RabbitMQ).Spring AMQP/RabbitMQ und Hibernate Transaction Mananger
ich die Hibernate Transaktionsmanager wie folgt konfiguriert bin mit:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" p:dataSource-ref="dataSource" />
Ich bin mit dem SimpleMessageListenerContainer für asynchronen Nachrichtenempfang konfiguriert als:
@Resource(name="transactionManager")
private PlatformTransactionManager txManager;
@Autowired
private MyListener messageListener;
@Bean
public SimpleMessageListenerContainer mySMLC()
{
final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory);
container.setQueueNames("myQueue");
final MessageListenerAdapter adapter = new MessageListenerAdapter(messageListener);
adapter.setMessageConverter(converter);
container.setMessageListener(adapter);
container.setChannelTransacted(true);
container.setTransactionManager(txManager);
return container;
}
Also im Grunde habe ich, dass der Empfang angegeben von Nachrichten muss transaktional sein. Der Nachrichten-Listener ruft einen Service auf, bei dem Methoden mit @Transactional versehen und möglicherweise CRUD-Operationen in der Datenbank ausgeführt werden können.
Meine Frage ist, gibt es ein Problem mit dem HibernateTransactionManager, um die Transaktion auf der Ebene SimpleMessageListenerContainer zu verwalten? Wird es Probleme geben, einen DB-Transaktionsmanager zu verwenden, um den Empfang von Nachrichten von RabbitMQ zu verpacken?
Ich erwarte XA hier nicht. Ich möchte nur sicherstellen, dass, wenn irgendwelche Operationen in der DB durch den Dienst fehlschlagen, die Nachricht nicht an den RabbitMQ-Broker weitergeleitet wird.