通過Thread session管理 jms事務(wù)

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)用方法是不可以回滾的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容