Mam aplikację Spring, która używa Hibernate i PostgreSQL. Używa również Spring AMQP (RabbitMQ).Spring AMQP/RabbitMQ i Hibernate Transaction Mananger
Używam menedżera Hibernate transakcja skonfigurowany w następujący sposób:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" p:dataSource-ref="dataSource" />
Używam SimpleMessageListenerContainer asynchronicznego odbioru komunikatu skonfigurowany jako:
@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;
}
Więc w zasadzie mam określonej że recepcji wiadomości muszą być transakcyjne. Moduł nasłuchujący wywołuje usługę, która może mieć metody oznaczone przez @Transactional i prawdopodobnie wykonywać operacje CRUD na DB.
Moje pytanie brzmi, czy istnieje problem z korzystaniem z HibernateTransactionManager do zarządzania transakcją na poziomie SimpleMessageListenerContainer? Czy wystąpią jakiekolwiek problemy z użyciem menedżera transakcji DB do zawijania otrzymywania wiadomości od RabbitMQ?
Nie oczekuję tutaj XA. Chcę tylko upewnić się, że jeśli jakiekolwiek operacje na DB przez usługę nie powiedzie się, wiadomość nie zostanie potwierdzona do brokera RabbitMQ.