我有一个使用Hibernate和PostgreSQL的Spring应用程序。它也使用Spring AMQP(RabbitMQ)。Spring AMQP/RabbitMQ和Hibernate Transaction Mananger
我使用配置Hibernate的事务管理器如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" p:dataSource-ref="dataSource" />
我使用和SimpleMessageListenerContainer异步消息接收配置为:
@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;
}
所以基本上我已经指定了接待的消息需要是事务性的。消息侦听器调用一个可以使用@Transactional注释方法的服务,并可能在数据库上执行CRUD操作。
我的问题是,使用HibernateTransactionManager来管理SimpleMessageListenerContainer级别的事务有问题吗?使用数据库事务管理器包装从RabbitMQ收到的消息是否会有问题?
我不期待XA在这里。我只想确保如果服务对数据库的任何操作都失败,则消息不会被传递给RabbitMQ代理。