如何防止Spring MVC中的并发调用

时间:2018-01-29 19:55:05

标签: java spring spring-mvc resttemplate

全部交易,我在春季mvc面临一个问题。从我们的一个外部系统说,支付网关将在他们的交易完成后给我们打电话[/ getRespFromExternal],不幸的是他们正在给我们打电话多次。

在方法getRespFromExternal中,我们调用内部webservice来处理支付确认,在WS调用完成之前我从外部系统获得另一个重复调用。所以我在控制器中的payResponse方法中得到payInd为null。在第一次调用[WS调用]完成后,来自控制器的/ payResponse甚至没有调用。对不起我的英语不好。请指教我。

外部系统调用的服务方法:

@RequestMapping(value="/getRespFromExternal",method=RequestMethod.POST)
public String getRespFromExternal(HttpServletRequest httpRequest,HttpServletResponse httpResponse,HttpSession session){
    if (httpRequest != null && session.getAttribute("extRespId") == null) {
        session.setAttribute("extRespId", httpRequest.getParameter("tranID"));
        // internal web service call
        callInternalWS(); // to process payment
        before processing above WS method i get another call from external[/getRespFromExternal] for second time;
        session.setAttribute("payInd", "Y");

        return "redirect:/payResponse/";
    }
    return "redirect:/payResponse/";
}

控制器方法:

@RequestMapping(value = "/payResponse/", method = RequestMethod.GET)
public ModelAndView payResponse(HttpServletRequest request, HttpSession session) {

    String payInd = (String) session.getAttribute("payInd");
    System.out.println("payInd --> "+payInd);
    if (payInd != null && payInd.trim().equalsIgnoreCase("Y") ) {

    }   
}   

1 个答案:

答案 0 :(得分:0)

如果您使用相同的交易多次调用您的服务,则应该将其视为错误。

我假设您使用交易数据库记录付款。

如果是这样,那么您可以使事务id成为数据库中的唯一键。如果由于重复键而导致记录事务的SQL插入或更新失败,请重定向到其他URL以报告错误。