加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – Spring MVC中的同步方法

发布时间:2020-12-15 01:47:27 所属栏目:大数据 来源:网络整理
导读:我试图在spring控制器中使用synchronize方法.因为我们的支付网关点击方法[@RequestMapping(value =“/ pay”,method = RequestMethod.POST)]不同的交易[txn id:txn01 txn02]一次.但由于使用了同步块,这两个不同的事务处理逐个并行处理. 问题 >为什么我在控

我试图在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读