我试图在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);
}
}
最佳答案
我不确定您是否在分布式环境中工作.
原文链接:https://www.f2er.com/spring/437470.html如果只有一台计算机,则可以删除同步关键字,并使用您的转换ID创建name-based锁.
如果这个程序在一个集群中工作,并且有多台机器,这意味着请求可能被分配给不同的机器,我认为你需要使用Redis或其他框架的aquaire distribution-lock.