我刚刚开始使用Wicket(并且对很多Web开发并不太熟悉)并且对下载链接有疑问。我有一个Web应用程序,它只允许用户上传特定文件,处理文件中的一些信息,并提供不同格式的处理信息的下载。然而,这真的应该是我正在研究的某些软件的精简版本,所以我真的不想做太多的处理。我想知道是否有办法为下载链接设置超时,这样如果用户点击链接并且处理时间超过20秒左右,它将只是退出处理并向他们发送错误代替。谢谢!
答案 0 :(得分:4)
我同意Xavi的意见,处理(以及可能的处理终止)应该用一个线程完成。
但是,特别是如果它只需要几秒钟,那么不仅要等待打开连接,而是定期检查线程是否完成,这样做要好得多。
我会做这样的事情:
Panel
,上面写着“处理您的下载内容”或类似内容。AbstractAjaxTimerBehavior
附加到面板上,计时器持续时间为10秒左右。onTimer
方法中,检查处理的状态:
答案 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");
}
}
};