【问题标题】:Java Web Application : Monitoring ProgressJava Web 应用程序:监控进度
【发布时间】:2013-02-21 13:14:35
【问题描述】:
很多时候,Java Web 应用程序中有一些由 http servlet 调用的长时间运行的进程。一个典型的例子是,将 100 个 mp3 文件转换为 flak 格式(只是一个随机示例)。 http 连接将是活动的,但是由于该过程需要很长时间,因此我们可以构建一些进度条以显示在网页上(最好是 uisng ajax),以指示任务的进度。这应该是什么设计模式?比如说,Servlet 的 post 方法会调用实际的长期进程,而 Servlet 的 get 方法会调用进度监听器?
【问题讨论】:
标签:
java
jakarta-ee
web-applications
progress-bar
【解决方案1】:
在 Java EE 中我推荐以下结构:
- Servlet 调用(例如 POST)将启动进程
- POST 将使用
@Asynchronous EJB 调用来处理繁重的负载,从而开始执行耗时过程
- 它还将传递一个进度持有者对象,例如放入上下文/会话中的 POJO(@Stateful EJB 也可以)
- POST 返回,后台作业继续
- 状态检查由 Ajax HTTP 调用执行,它们使用与启动器相同的会话
- Ajax 调用从 session/context/@Stateful 获取 progress holder 对象,读取状态并返回
- 后台线程不断更新状态(更新应该是同步的,除非你只使用布尔、char、int或float中的一个属性(最大32bit原语))
请注意,@Asynchronous 自 EJB 3.1 起可用。