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