Play框架中的进度指示器

5
什么是在Play中实现一种进度指示器的最佳方法?
我有一个简单的导入页面,用户可以上传csv文件。然后服务器进行一些漫长的处理,直到导入完成。我想在上传后将用户重定向到另一页,并在此页面上提供一些继续反馈,比如“已导入856个数据集中的150个”。
上传操作会触发控制器方法,该方法可以在自己的线程中启动耗时任务,但我如何从另一个页面使用ajax调用获取作业状态(因为play没有任何请求之间的状态)?
2个回答

3
您可能需要在控制器中创建一个作业。实际上,如果您阅读Play文档,您会明确被鼓励将长时间运行的处理放在作业中,以便它们不会占用HTTP请求线程。
因此,您的作业正在运行,正在处理CSV文件。下一步是记录每个数据集何时被处理。所以,假设您向作业传递一个引用,比如一个uid或某个唯一的数字,您将其传回给客户端。然后,您只需要记录(可能在数据库中,如果您想符合无状态和易于扩展的要求)每个数据集处理的增量,并针对您的唯一ID进行记录。
例如:
@Entity
public class DatasetProgress extends Model {

    public Long uid;
    public Long datasetsDone;
    public Long datasetsTotal;

}

您可以创建一个控制器操作,根据您的uid返回DatasetProgress对象,您可以使用它来显示进度条。


1

你可以做的一件事是有一个集中的通知系统。你可以给导入的某些内容一个唯一的标识符,并使用此标识符编写更新消息。然后,要检索状态,只需使用该标识符。

另一个选项是使用Web套接字,基本上将通知推送回客户端(尽管它们还没有被广泛支持)。


1
我会使用John和@Codemwnci的两个答案来完成这个任务,特别是如果你确定将使用支持WebSockets或至少Comet的浏览器。在这种情况下,您可以构建真正类似实时的进度条。 - biesior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接