JmsTransactionManager 管理jms事务

上一篇写了 通过自己的本地事务来管理 jms的事务
这一篇说一下 用 JmsTranscationManager来管理事务

image.png

可以看到 和本地事务相比 这种形式 是通过jmsTranscationMnager 生成了一个JMSResourceHolder来管理session。
所以也可以想到 在代码实现的时候 就一定是要对JmsTransactionManager进行配置的

所有要新建一个配置类

 @EnableJms
@Configuration
public class ConfigJms {
    @Bean
    JmsTransactionManager jmsTransactionManager(ConnectionFactory cf) {
        return new JmsTransactionManager(cf);
    }

    @Bean
    JmsTemplate jmsTemplate(ConnectionFactory cf) {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(cf);
        return jmsTemplate;
    }

    @Bean
    JmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory cf,
                                                               PlatformTransactionManager transactionManager,
                                                               DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, cf);
        factory.setReceiveTimeout(10000L);
        factory.setConnectionFactory(cf);
        factory.setTransactionManager(transactionManager);
        return factory;
    }
}

主要是配置了一个自己的JmsListenerContainerFactory 然后在service的方法中

    @Transactional
    @JmsListener(destination = "customer:msg:new", containerFactory = "jmsListenerContainerFactory")
    public void sendMsg(String msg) {
        String msgReply = "Local reply:" + msg;
        jmsTemplate.convertAndSend("customer:msg:reply", msgReply);
        if (msg.contains("error")) {
            sendError();
        }
    }

加上containerFactry 名字是自己定义的containerFactory
在之前使用本地session的时候 如果使用方法的方式来进行传递消息
是无法进行回滚的。
加上@Transactional 实现回滚的效果 出现报错时 信息不回录入。

你可能感兴趣的:(JmsTransactionManager 管理jms事务)