2012-06-19 56 views
5

在Play中执行某种进度指示器的最佳方式是什么?Play框架中的进度指示器

我有一个简单的导入页面,用户可以上传一个csv文件。服务器然后进行一些长处理,直到导入完成。我想在上传后将用户重定向到一个单独的页面,并在此页面上给他一些持续的反馈,即“导入了856个数据集中的150个”。

上传操作会触发一个控制器方法,该方法可以在自己的线程中启动耗时的任务,但是如何从另一个页面获得ajax调用的作业状态(因为播放没有任何类型的请求之间的状态)?

回答

3

你可能要做的是从你的控制器创建一个作业。事实上,如果您阅读了Play文档,则明确建议您在作业中执行长时间运行的处理,以免它们占用HTTP请求线程。

因此,您的工作正在运行,通过处理您的CSV文件。下一步是记录每个数据集的处理时间。所以,假设你通过你的工作一个参考,像一个用户名或一些独特的号码,你传回给你的客户。然后你只需要记录(可能在数据库中,如果你想顺从无状态和轻松扩展),你的唯一ID处理的数据集的数量就会增加。

例如

@Entity 
public class DatasetProgress extends Model { 

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

} 

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

1

你可以做的一件事是有一些集中通知的事情。你可以给导入一些唯一的标识符,并写入用这个ID键入的更新消息。然后要检索状态,只需使用该键即可。

另一个选择是使用网络套接字,并基本上推送通知回到客户端(虽然他们还没有广泛支持)。

+1

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