2012-06-07 44 views
1

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

Ours是一个带Hibernate 3.5 ORM的struts 2 web应用程序。浏览到一些java调度库后,在Quartz上获得了一些信息。 但是Quartz是否适合上述要求或我可以尝试的任何其他库? 请指导我在正确的方向。

+0

有没有问题.... – Th0rndike

回答

7

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

  • - 此库非常全面,可以让您安排各种作业。如果你想使用它只是在后台调度作业的目的,并立即运行它们,可能是矫枉过正

  • 使用线程池,见Executors

  • 队列可以请求听和异步处理他们 S的@Async/@Asynchronous支持

  • 最后,你可以充分利用

然后你mut以某种方式恢复结果。Depening你是否要直接在浏览器或通过电子邮件解救他们

  • 每次

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

  • ,如果你想通过电子邮件发送的结果,只是在作业完成后发送饰面。更简单但不太友好的恕我直言。

+0

感谢您的详细回复。正如前面提到的Quart-Scheduler一样,这个库是关于在后台运行一个预定的作业,它是否允许用户交互(按钮点击或链接)类型运行作业? Threadpool(executors)也是一种替代解决方案吗? –

+0

通过与用户交互运行作业,您的意思是什么?你可以开始一个用户操作的工作,比如点击按钮,但是这个工作在后台运行,你无法控制它。 Quartz使用下面的线程池,所以如果你需要轻量级的东西,直接使用线程池。 –

+0

所以直接使用线程池就足以在后台添加作业并执行,并且可以中间获取作业状态。并在工作完成后发送电子邮件/或网站上的弹出窗口。 –

1

石英确实是这样做的一种方式 - 如果您想要安排工作在特定时间或特定频率下运行,则工作得很好。

如果你只是想踢东西掉在后台响应用户操作,并检查其状态,也有一些其他的方法来做到这一点可能更适合这种模式:

  • java.util.concurrent包:您可以设置一个ThreadPoolExecutor并向其提交执行Callable的任务。您可以返回一个Future<T>对象,您可以检查完成(isDone)并在完成时得到结果(get)。

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