5

在 Play 中实现某种进度指示器的最佳方式是什么?

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

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

4

2 回答 2

3

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

因此,您的工作正在运行,通过处理您的 CSV 文件。下一步是记录每个数据集的处理时间。因此,假设您向您的 Job 传递了一个参考,例如一个 uid 或某个唯一编号,然后您将其传递回您的客户。然后,您只需要记录(如果您想符合无状态并轻松扩展,可能在数据库中)根据您的唯一 ID 处理的数据集数量的每个增量。

例如

@Entity
public class DatasetProgress extends Model {

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

}

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

于 2012-06-19T17:07:47.247 回答
1

您可以做的一件事是进行一些集中通知。您可以为导入提供一些唯一标识符并编写以该 ID 为键的更新消息。然后要检索状态,您只需使用该密钥。

另一种选择是使用网络套接字并将通知推送回客户端(尽管它们尚未得到广泛支持)。

于 2012-06-19T16:44:30.747 回答