Hibernate と PostgreSQL を使用する Spring アプリケーションがあります。また、Spring AMQP (RabbitMQ) も使用します。
次のように構成された Hibernate Transaction Manager を使用しています。
<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 レベルでトランザクションを管理することに問題はありますか? DB トランザクション マネージャーを使用して、RabbitMQ からのメッセージの受信をラップする問題はありますか?
私はここで XA を期待していません。サービスによる DB での操作が失敗した場合に、メッセージが RabbitMQ ブローカーに ack されないようにしたいだけです。