Java Web应用程序中的异步任务

时间:2012-06-07 13:37:29

标签: java asynchronous quartz-scheduler

异步作业,例如来自网站的下载分数,或在完成某些关键任务后发送电子邮件。 当我们下载一些分数时,我们必须等待当前页面才能获得响应页面或下载文件。 有没有可能我可以点击下载分数,它发生在后台,以便我可以导航到其他部分 的网站,并在平均时间检查工作的状态。或者在将来安排一些工作并获得执行结果 通过电子邮件。

我们的是带有Hibernate 3.5 ORM的struts 2 webapplication。浏览了一些java调度库后,得到了一些关于Quartz的信息。 但Quartz是否适合上述要求或我可以尝试的任何其他库? 请指导我正确的方向。

2 个答案:

答案 0 :(得分:7)

您需要某种异步处理支持。您可以使用:

  • - 此库非常全面,可让您安排各种工作。如果您只想使用 来在后台安排作业并立即运行它们,可能会出现问题

  • 使用线程池,请参阅Executors class

  • 队列可以侦听请求并在 s

  • 中异步处理它们
  • 最后,您可以利用

  • 中的@Async / @Asynchronous支持

然后你以某种方式恢复结果。取决于您是想直接在浏览器中还是通过电子邮件发送它们:

  • 每次渲染页面时,请检查是否有任何已完成/正在进行的作业。如果有一些已完成的作业,则在某个页面上显示一个额外的链接(通知类型)。如果作业正在进行中,请启动请求并每隔一秒询问一次,或使用长轮询/ 立即收到结果

  • 如果您想通过电子邮件发送结果,请在作业完成后发送。更简单但用户友好的恕我直言。

答案 1 :(得分:1)

Quartz当然是一种方法 - 如果你想安排一个特定时间或特定频率的作业,那么效果很好。

如果您只是想在后台启动某些操作以响应用户操作,并检查其状态,还有其他一些方法可以更好地适应此模式:

  • java.util.concurrent包:您可以设置ThreadPoolExecutor并向其提交实现Callable的任务。您将获得一个Future<T>对象,您可以检查其完成情况(isDone),并在完成后获取结果(get)。

  • 使用EJB或Spring,还有一个(会话)bean方法的概念是@Async@Asynchronous,它返回Future<T>并且行为与上面一样。基本上,这只是从代码中抽象出线程池创建和管理,并将其移动到容器或框架中。