我有一个使用Hibernate和PostgreSQL的Spring应用程序。它还使用Spring AMQP(RabbitMQ)。
我正在使用如下配置的Hibernate事务管理器:
我正在使用SimpleMessageListenerContainer作为异步消息接收器,配置如下:
我正在使用如下配置的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 操作的服务。
我的问题是,在 SimpleMessageListenerContainer 级别上使用 HibernateTransactionManager 来管理事务是否会有问题?在使用 DB 事务管理器包装从 RabbitMQ 接收消息时是否会出现任何问题?
我不期望 XA。我只想确保如果服务对数据库的任何操作失败,消息不会被确认给 RabbitMQ 代理。