通过Thread session管理 jms事务
2019-05-16 本文已影响0人
employeeeee
JMS事务管理机制有两种
- Session管理的事务
- 外部管理的事务 JmsTransactionManager JTA
这篇主要记录 通过session来管理jms的事务。
思路是在收到一个消息后,会将回应的消息加入到另外一个session中
为了测试JMS的事务
所以通过两种方式来进行消息的传递
一种是直接调用service中的方法 另一种是通过@JmsListener
来进行判断
在service
里写两个方法
@JmsListener(destination = "customer:msg:new")
public void sendMsg(String msg){
String msgReply = "Local reply:"+ msg;
jmsTemplate.convertAndSend("customer:msg:reply",msgReply);
if (msg.contains("error")){
sendError();
}
}
public void sendError(){
throw new RuntimeException("some error be created");
}
第一个是向另一个session中发送消息的方法 第二个是Error 用来测试回滚的。
然后在controller中写三个方法
@RequestMapping("/sendMsgByListen")
public void sendMsgByListen(@RequestParam String msg){
jmsTemplate.convertAndSend("customer:msg:new",msg);
}
@RequestMapping("/sendMsgByMethod")
public void sendMsgByMethod(@RequestParam String msg){
customerService.sendMsg(msg);
}
@RequestMapping("/getMsg")
public String getMsg(){
jmsTemplate.setReceiveTimeout(2000);
Object o = jmsTemplate.receiveAndConvert("customer:msg:reply");
return String.valueOf(o);
}
可以看到三个方法分别是通过监听器 通过方法来进行消息的发送和一个查询消息的方法。
然后进行测试 可以发现通过listener监听这种方式的方法 可以回滚
而直接调用方法是不可以回滚的