2

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

4

2 回答 2

4

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

但是,特别是如果它花费的时间超过几秒钟,最好不要只等待打开的连接,而是定期检查线程是否完成。

我会做这样的事情:

  1. 启动线程做实际工作
  2. 显示Panel“正在处理您的下载”或类似的内容。
  3. AbstractAjaxTimerBehavior以 10 秒左右的计时器持续时间将一个附加到面板上。
  4. 在计时器行为的onTimer方法中,检查处理的状态:
    • 如果它仍然有效,则什么也不做。
    • 如果因为时间过长而取消,请向用户显示“已取消”之类的消息,例如通过更换面板或将警告标签设置为可见。
    • 如果完成,请显示“您的下载正在开始”之类的消息并开始下载。请参阅此文档了解如何进行 AJAX 响应并同时启动下载
于 2012-09-13T09:38:54.147 回答
2

为了能够在处理时间超过给定时间量时取消处理,最好在单独的线程中执行它。此问题在以下问题中得到解决:如何使线程超时

现在对于它的 Wicket 部分:如果我理解您要实现的目标,您可以例如滚动您自己的Link来执行处理,并以结果响应以防它不超时。如果处理时间过长,您可以简单地抛出一个错误(记住要有一个FeedbackPanel以便显示)。

要下载的文件的处理或生成可以以LoadableDetachableModel提高效率来实现。有关更多详细信息,请参阅此问题:如何将 Wicket 的 DownloadLink 与动态生成的文件一起使用?

例如:

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");
            }
        }
    };
于 2012-09-12T22:31:50.240 回答