通过Thread session管理 jms事务

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事务)