JMS事務(wù)管理機(jī)制有兩種
- Session管理的事務(wù)
- 外部管理的事務(wù) JmsTransactionManager JTA
這篇主要記錄 通過session來管理jms的事務(wù)。
思路是在收到一個(gè)消息后,會(huì)將回應(yīng)的消息加入到另外一個(gè)session中
為了測(cè)試JMS的事務(wù)
所以通過兩種方式來進(jìn)行消息的傳遞
一種是直接調(diào)用service中的方法 另一種是通過@JmsListener來進(jìn)行判斷
在service里寫兩個(gè)方法
@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");
}
第一個(gè)是向另一個(gè)session中發(fā)送消息的方法 第二個(gè)是Error 用來測(cè)試回滾的。
然后在controller中寫三個(gè)方法
@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);
}
可以看到三個(gè)方法分別是通過監(jiān)聽器 通過方法來進(jìn)行消息的發(fā)送和一個(gè)查詢消息的方法。
然后進(jìn)行測(cè)試 可以發(fā)現(xiàn)通過listener監(jiān)聽這種方式的方法 可以回滾
而直接調(diào)用方法是不可以回滾的