【发布时间】:2021-08-16 17:59:05
【问题描述】:
所以正如标题所描述的,我想实现以下目标
@Controller
public class ImportController {
@RequestMapping(value = "/{File}", method = RequestMethod.GET)
@LogAware
public String import(@PathVariable(value = "File") String excel, Model model) {
try {
synchronized (this) {
//code...
}
}
}
}
我希望代码一次只针对 1 个请求执行。同步块内的代码执行可持续约 1 小时。同时,我希望取消到达该方法的每个其他请求。有什么方法可以实现吗?
澄清一下:
现在第一个请求将被处理,当它完成时,等待锁的下一个请求将被处理,然后是下一个正在等待的请求。
我想要的是不允许在第一个请求完成后已经等待服务的其他请求。如果请求是在执行第一个请求期间出现的,我想向用户返回错误请求或其他内容并取消他们的请求。
【问题讨论】:
-
您可以尝试用可重入锁替换同步块,并在该类中使用 tryLock() 方法。如果任何其他线程持有锁,则此方法将返回 false,您可以完成请求。
-
*我想要的是不允许在第一个请求完成后处理其他请求。 * 您的意思是该方法预计只在应用程序的生命周期内执行一次?
-
@Adarsh 我想要的是不允许在第一个请求完成后已经等待服务的其他请求
-
从某种意义上说,在执行其他请求期间发生的任何事情都必须取消。
标签: java spring multithreading synchronization