在Wicket中为下载链接设置超时?

时间:2012-09-12 20:02:27

标签: java wicket

我刚刚开始使用Wicket(并且对很多Web开发并不太熟悉)并且对下载链接有疑问。我有一个Web应用程序,它只允许用户上传特定文件,处理文件中的一些信息,并提供不同格式的处理信息的下载。然而,这真的应该是我正在研究的某些软件的精简版本,所以我真的不想做太多的处理。我想知道是否有办法为下载链接设置超时,这样如果用户点击链接并且处理时间超过20秒左右,它将只是退出处理并向他们发送错误代替。谢谢!

2 个答案:

答案 0 :(得分:4)

我同意Xavi的意见,处理(以及可能的处理终止)应该用一个线程完成。

但是,特别是如果它只需要几秒钟,那么不仅要等待打开连接,而是定期检查线程是否完成,这样做要好得多。

我会做这样的事情:

  1. 开始执行实际工作的主题
  2. 显示一个Panel,上面写着“处理您的下载内容”或类似内容。
  3. AbstractAjaxTimerBehavior附加到面板上,计时器持续时间为10秒左右。
  4. 在计时器行为的onTimer方法中,检查处理的状态:
    • 如果它仍然有效,则什么也不做。
    • 如果由于花费的时间太长而被取消,则向用户显示“已取消”等消息,例如通过更换面板或将警告标签设置为可见。
    • 如果已完成,请显示“您的下载正在启动”之类的消息并开始下载。有关如何执行AJAX响应并同时启动下载,请参阅this document

答案 1 :(得分:2)

如果处理时间超过给定时间,则能够取消处理,在单独的线程中执行它是合适的。这个问题在以下问题中得到解决:How to timeout a thread

现在对于Wicket的一部分:如果我理解了你想要实现的目标,你可以例如推出自己的Link来执行处理,并在结果的情况下做出回应,以防它没有。 t超时。如果处理花费太多时间,您可以简单地抛出一个错误(记得有一个FeedbackPanel以便可以显示它。)

为了提高效率,可以在LoadableDetachableModel中实现处理或生成要下载的文件。有关详细信息,请参阅此问题:How to use Wicket's DownloadLink with a file generated on the fly?

例如:

IModel<File> processedFileModel = new LoadableDetachableModel<File>(){
    protected File load(){
        // Implement processing in a separate thread. 
        // If it times out it could return null, for instance
    }

}

Link<File> downloadLink = new Link<File>("yourID", processedFileModel) {
        @Override
        public void onClick() {
            File processedFile = getModelObject();
            if (file != null) {
                IResourceStream rs = new FileResourceStream(file);
                getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(rs));
            } else {
                error("Processing took too long");
            }
        }
    };