【问题标题】:Want to create a synchronized data download in servlet action想要在 servlet 操作中创建同步数据下载
【发布时间】:2011-12-01 17:57:16
【问题描述】:

我想创建一个如下所示的 servlet 方法。在这种方法中,我想执行一些数据下载。因此,如果有数据下载请求,我只需进行下载。如果已经在进行下载,我希望以某种方式第二个请求等到第一个线程完成下载。一旦第一个线程完成下载,第二个线程可以自动启动。

DoTheDownloadAction(){

}

我怎样才能达到上述要求?

【问题讨论】:

  • 如果您连接许多客户端,下载速度会非常慢。

标签: java multithreading servlets thread-safety mutex


【解决方案1】:

考虑到您有一个 DownloadHelper 类,并且在您的 Servlet 中创建了该类的一个实例,那么您可以执行以下操作:

DoTheDownloadAction() {
   synchronized(downloadHelper) {
      //Downloading something
   }
}

假设您的 jsp 中有一个名为“下载”且 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');
       });
   });
});

【讨论】:

  • 我会有一个jsp页面,它会显示当前正在下载。因此,如果用户想要进行第二次下载,他应该收到一条消息,说明一次下载已经在进行。我怎样才能做到这一点?
  • hmm 在这种情况下,您需要在您的 jsp 页面上设置一个下载计数器,假设您正在使用 ajax,并且您有一个标志来检查下载是否完成,如果标志为假,则通知用户或否则开始下载
  • 你能帮我更多吗?可能您可以帮助设计 jsp 页面以及操作类。 :)
【解决方案2】:

听起来像是信号量的完美候选者,或者(取决于复杂性和下游效果)影响相同更改的更简单方法是将下载代码同步到应用程序的相关键。

【讨论】:

    【解决方案3】:

    考虑到通常网络服务器可以分布式以实现可扩展性。通常适当的解决方案是通过数据库锁进行同步。但是,对您来说,在您想要等待的对象上使用 synchronized java 关键字可能就足够了。

    另外,您要求的是悲观锁。这通常是糟糕的架构设计。

    【讨论】:

    • 我会有一个 jsp 页面,它会显示当前正在下载。因此,如果用户想要进行第二次下载,他应该收到一条消息,说明一次下载已经在进行。我怎样才能做到这一点?
    • 你有数据库吗?如果是这样,则在此处保持下载状态。然后有人开始下载,改记录。然后有人尝试-检查记录。如果您想要纯 Java 解决方案,请使用 java.util.concurrent.locks.ReentrantLock#tryLock()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2020-09-02
    相关资源
    最近更新 更多