Spring 对于数据源和JMS事务同步,除了JmsTransactionManager之外,我还需要在JmsTemplate中配置SetTransaction吗?

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

我需要在一个事务中同步消息接收、保存到数据库和发送另一条消息。我使用的是Spring Boot,依靠它的自动配置。消息代理是活动的MQ

对于我的用例,使用best effort 1阶段提交就足够了,因此我配置了一个
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时)。我提出了类似的问题: