java – Spring MVC中的同步方法

前端之家收集整理的这篇文章主要介绍了java – Spring MVC中的同步方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我试图在spring控制器中使用synchronize方法.因为我们的支付网关点击方法[@RequestMapping(value =“/ pay”,method = RequestMethod.POST)]不同的交易[txn id:txn01& txn02]一次.但由于使用了同步块,这两个不同的事务处理逐个并行处理.

问题 – >为什么我在控制器中使用同步块就是说,事务[txn01]点击[@RequestMapping(value =“/ pay”,method = RequestMethod.POST)]两次,就像来自支付网关的重复呼叫一样.在完成第一次呼叫[后端处理]之前,我从支付网关获得相同转账的第二次呼叫.

有没有办法处理两个不同的事务并行使用同步块中的事务ID而不是重复调用我的意思是相同的转义.请指教.

如果我的问题不清楚,请告诉我.

@RequestMapping(value="/pay",method=RequestMethod.POST)
public String payAck(HttpServletRequest httpRequest,HttpServletResponse httpResponse,HttpSession session){
    synchronized (this) {
        return this.processPayAck(httpRequest,httpResponse,session);
    }
}

public synchronized String processPayAck(HttpServletRequest httpRequest,HttpSession session){
   // Payment Acknowledgment process here
    if (sametranIDNotExists) {
        // first call here
        callWS(); - processing business logic.
        return someURL;
    } else {
       // Gets second call here before first call completed
       return someURL;
    }
}

修改后的代码

在同步块中使用实习生是否正确?

@RequestMapping(value="/pay",HttpSession session){
    String tranID = httpRequest.getParameter("tranID");
    synchronized (String.valueOf(tranID).intern()) {
        return processPayAck(httpRequest,session);
    }
}
最佳答案
我不确定您是否在分布式环境中工作.

如果只有一台计算机,则可以删除同步关键字,并使用您的转换ID创建name-based锁.

如果这个程序在一个集群中工作,并且有多台机器,这意味着请求可能被分配给不同的机器,我认为你需要使用Redis或其他框架的aquaire distribution-lock.

原文链接:https://www.f2er.com/spring/437470.html

猜你在找的Spring相关文章