我想创建一个像下面这样的servlet方法。在这种方法中,我想执行一些数据下载。如果请求数据下载,我只需要下载。如果已经下载了,我想以某种方式第二个请求等待第一个线程完成下载。一旦第一个线程完成下载,第二个线程就可以自动启动。
DoTheDownloadAction(){
}
我如何达到上述要求?
答案 0 :(得分:0)
听起来像信号量的完美候选者,或者(取决于复杂性和下游效应)影响相同更改的更简单方法是将下载代码同步到应用程序的相关密钥。
答案 1 :(得分:0)
考虑到你有一个DownloadHelper
类,并且在你的Servlet中你已经创建了该类的一个实例,那么你可以这样做:
DoTheDownloadAction() {
synchronized(downloadHelper) {
//Downloading something
}
}
让我们假设你的jsp中有一个名为“download”的按钮,id =“download”,你在javascript中有这个代码
var globalDownloadStatus = false;
jQuery(document).ready(function(){
jQuery('#download'(.click(function(){
if(globalDownloadStatus == true) {
alert('download already in progress, please wait');
return;
}
jQuery.get('yourservletpath', function(data){
alert('Download Complete');
});
});
});
答案 2 :(得分:0)
请注意,通常Web服务器可以分发以实现可伸缩性。通常,适当的解决方案是通过数据库锁进行同步。但是对于您而言,可能只需要在您想要等待的对象上使用synchronized
java关键字。
另外,你要求一个悲观的锁。这通常是糟糕的架构设计。