上一篇寫(xiě)了 通過(guò)自己的本地事務(wù)來(lái)管理 jms的事務(wù)
這一篇說(shuō)一下 用 JmsTranscationManager來(lái)管理事務(wù)
可以看到 和本地事務(wù)相比 這種形式 是通過(guò)
jmsTranscationMnager
生成了一個(gè)JMSResourceHolder
來(lái)管理session。所以也可以想到 在代碼實(shí)現(xiàn)的時(shí)候 就一定是要對(duì)
JmsTransactionManager
進(jìn)行配置的
所有要新建一個(gè)配置類
@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;
}
}
主要是配置了一個(gè)自己的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的時(shí)候 如果使用方法的方式來(lái)進(jìn)行傳遞消息
是無(wú)法進(jìn)行回滾的。
加上@Transactional 實(shí)現(xiàn)回滾的效果 出現(xiàn)報(bào)錯(cuò)時(shí) 信息不回錄入。