私は、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で注釈が付けられたメソッドを持つことができ、DB上でCRUD操作を実行できるサービスを呼び出します。
私の質問は、HibernateTransactionManagerを使用してSimpleMessageListenerContainerレベルでトランザクションを管理する際に問題がありますか? RabbitMQからのメッセージの受信をラップするのにDBトランザクションマネージャを使用する際に問題はありますか?
私はここにXAを期待していません。サービスでDB上の操作が失敗した場合、メッセージはRabbitMQブローカーにアクセスされないようにしたいだけです。