gpt4 book ai didi

java - Spring MVC 中的同步方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:57 27 4
gpt4 key购买 nike

我正在尝试在 spring Controller 中使用同步方法。因为我们的支付网关一次点击方法 [@RequestMapping(value="/pay",method=RequestMethod.POST)] 不同的交易 [txn id : txn01 & txn02]。但是由于使用同步块(synchronized block),这 2 个不同的事务处理一个一个地处理而不是并行。

问题 -> 为什么我在 Controller 中使用同步块(synchronized block)是说事务 [txn01] 命中 [@RequestMapping(value="/pay",method=RequestMethod.POST)] 两次,就像来自支付网关的重复调用一样。在完成第一次调用 [后端处理] 之前,我收到来自支付网关的第二次调用相同的交易 ID。

除了重复调用之外,有什么方法可以通过在同步块(synchronized block)中使用事务 ID 来并行处理两个不同的事务,我的意思是相同的传输 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,HttpServletResponse httpResponse,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;
}
}

修改后的代码:

在同步块(synchronized block)中使用 intern 是否正确。

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

最佳答案

我不确定您是否在分布式环境中工作。

如果只有一台机器,可以去掉syncronized关键字,创建name-based改为使用您的交易 ID 锁定。

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

关于java - Spring MVC 中的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com