上一篇写了 通过自己的本地事务来管理 jms的事务
这一篇说一下 用 JmsTranscationManager来管理事务
可以看到 和本地事务相比 这种形式 是通过
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 实现回滚的效果 出现报错时 信息不回录入。
网友评论