Spring 对于数据源和JMS事务同步,除了JmsTransactionManager之外,我还需要在JmsTemplate中配置SetTransaction吗?
我需要在一个事务中同步消息接收、保存到数据库和发送另一条消息。我使用的是Spring Boot,依靠它的自动配置。消息代理是活动的MQ 对于我的用例,使用best effort 1阶段提交就足够了,因此我配置了一个Spring 对于数据源和JMS事务同步,除了JmsTransactionManager之外,我还需要在JmsTemplate中配置SetTransaction吗?,spring,spring-boot,jms,spring-transactions,spring-jms,Spring,Spring Boot,Jms,Spring Transactions,Spring Jms,我需要在一个事务中同步消息接收、保存到数据库和发送另一条消息。我使用的是Spring Boot,依靠它的自动配置。消息代理是活动的MQ 对于我的用例,使用best effort 1阶段提交就足够了,因此我配置了一个ChainedTransactionManager: @EnableTransactionManagement @Configuration public class TransactionConfiguration { @Bean public PlatformTr
ChainedTransactionManager
:
@EnableTransactionManagement
@Configuration
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager chainedTransactionManager(DataSourceTransactionManager dtm,
JmsTransactionManager jtm) {
return new ChainedTransactionManager(jtm, dtm);
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
return new JmsTransactionManager(connectionFactory);
}
}
应用程序流程如下所示:
private final JmsTemplate jmsTemplate;
private final MessageRepository messageRepository;
@Transactional
@JmsListener(destination = "someDestination")
public void process(Message message){
jmsTemplate.isSessionTransacted();
//Save to DB
messageRepository.save(message);
//Send to another queue
jmsTemplate.convertAndSend("anotherDestination", new ProcessedMessage(message));
}
在process()
方法中,我看到jmsTemplate.isSessionTransact()代码>为false
我是否需要使用setSessionTransactived(true)
显式配置JmsTemplate
bean,或者用我当前的事务配置就足够了
配置JmsTemplate.setSessionTransactived(true)
与使用ChainedTransactionManager
+JmsTransactionManager
有什么区别
我有点困惑。如果您真的需要在单个事务中同步两个JMS操作(不清楚是否使用同一个代理)和一个数据库操作,“尽力1阶段提交”如何足够?这实际上不会使用单个事务,因此操作实际上不会是原子的,这意味着在发生故障的情况下,可能会有不一致的数据。您需要两阶段提交(即XA)以确保一致性。是的,读/写AMQ代理是相同的。DaveSyer的这篇优秀文章描述了为什么在我的商业案例中1PC场景就足够了:首先提交数据库事务。接下来,如果jms事务(jms读写)失败,则将回滚此事务。然后消息将被重新传递。我的使用者是幂等的,因此,如果重新传递消息时,它不会保存在DB中,只会发送到目标队列。FWIW,我认为这些信息非常有价值,可以添加到问题中以避免混淆。您提到的“单一事务”具有误导性,因为将有多个事务(一个用于JDBC,一个用于JMS),而不是一个事务(使用XA时)。我提出了类似的问题: