轮询 Java EE 后台任务状态 - 如何?

Polling Java EE background task status - how to?

我目前正在开发一个需要导入数据并进行一些处理的 Web 应用程序。这可能需要一些时间(可能在 "several minutes" 范围内,一旦数据集增长),所以我们 运行 它在后台 - 现在是在前端显示状态的时候了,而不是拖尾日志文件:)

前端正在使用 Angular,连接到 REST 端点 (JAX-RS) 调用 EJB 中的服务,通过 JPA 进行持久化。 运行 在 JBoss EAP 6.4 / AS 7.5 (EE6) 中。标准的东西,但这是我第一次处理 Java EE。

关于查询状态,定期轮询 REST 端点就可以了——我们不需要像 websockets 这样花哨的东西。不过,我们确实需要支持多个后台作业,以及包含运行状态 (running/done/error)、进度和错误列表的信息。

所以,我目前有两个问题:

1) 是否有比调用@Asynchronous EJB 方法更适合启动后台任务的方式?

2) 我有哪些选项可以跟踪后台任务,哪个选项最合适?

我的第一个想法是保留一个 HashMap,但很快就变成了太多手动(而且看起来很脆弱)的代码,并且存在并发性和生命周期问题 - 我不想重新发明轮子。安全的选择似乎是 JPA 坚持它,但对于不稳定的状态信息来说,这似乎有些笨拙。

我显然不是第一个遇到这些问题的人,但我的 google-fu 似乎现在还欠缺 :)

可以使用 @Asynchronous 或使用 JMS @MessageDriven

启动任务

来自java-ee-7 ManagedExecutorService也是一个选项。

然后任务将更新它们自己的状态,该状态存储在 @Singleton EJB 内的 ConcurrentHashMap 中。

如果您处于集群环境中,使用 JPA 可以更好地存储任务状态,因为 @Singleton 不适用于整个集群