나는 Hibernate와 PostgreSQL을 사용하는 Spring 어플리케이션을 가지고있다. 또한 Spring AMQP (RabbitMQ)를 사용합니다.Spring AMQP/RabbitMQ와 Hibernate Transaction Mananger
<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 중개인에게 반송되지 않도록하고 싶습니다.