在 Play 中实现某种进度指示器的最佳方式是什么?
我有一个简单的导入页面,用户可以在其中上传 csv 文件。然后服务器会进行一些冗长的处理,直到导入完成。我想在上传后将用户重定向到一个单独的页面,并在此页面上给他一些持续的反馈,例如“导入的 856 个数据集中的 150 个”。
上传操作触发了一个控制器方法,该方法可以在自己的线程中启动耗时的任务,但是我如何通过来自另一个页面的 ajax 调用来获取作业的状态(因为 play 在请求之间没有任何类型的状态) ?
在 Play 中实现某种进度指示器的最佳方式是什么?
我有一个简单的导入页面,用户可以在其中上传 csv 文件。然后服务器会进行一些冗长的处理,直到导入完成。我想在上传后将用户重定向到一个单独的页面,并在此页面上给他一些持续的反馈,例如“导入的 856 个数据集中的 150 个”。
上传操作触发了一个控制器方法,该方法可以在自己的线程中启动耗时的任务,但是我如何通过来自另一个页面的 ajax 调用来获取作业的状态(因为 play 在请求之间没有任何类型的状态) ?
您可能会从您的控制器创建一个作业。事实上,如果您阅读 Play 文档,我们明确鼓励您在 Jobs 中执行长时间运行的处理,以免它们占用 HTTP 请求线程。
因此,您的工作正在运行,通过处理您的 CSV 文件。下一步是记录每个数据集的处理时间。因此,假设您向您的 Job 传递了一个参考,例如一个 uid 或某个唯一编号,然后您将其传递回您的客户。然后,您只需要记录(如果您想符合无状态并轻松扩展,可能在数据库中)根据您的唯一 ID 处理的数据集数量的每个增量。
例如
@Entity
public class DatasetProgress extends Model {
public Long uid;
public Long datasetsDone;
public Long datasetsTotal;
}
然后,您可以创建一个控制器操作,该操作根据您的 uid 返回 DatasetProgress 对象,您可以使用它来显示进度条。
您可以做的一件事是进行一些集中通知。您可以为导入提供一些唯一标识符并编写以该 ID 为键的更新消息。然后要检索状态,您只需使用该密钥。
另一种选择是使用网络套接字并将通知推送回客户端(尽管它们尚未得到广泛支持)。