美文网首页
通过Thread session管理 jms事务

通过Thread session管理 jms事务

作者: employeeeee | 来源:发表于2019-05-16 10:48 被阅读0次
    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监听这种方式的方法 可以回滚
    而直接调用方法是不可以回滚的

    相关文章

      网友评论

          本文标题:通过Thread session管理 jms事务

          本文链接:https://www.haomeiwen.com/subject/eiseaqtx.html