处理“杀死”Java作业的方法?

时间:2009-11-28 22:32:24

标签: java rest concurrency jobs

我们的服务器Web应用程序将处理REST API请求所请求的作业。

理想情况下,如果服务器在作业期间死亡(即:拔出插头),则作业应在启动时恢复或重新启动。

处理这些作业的一种非常方便的方法是使用Java 5中的一些并发实用程序类在一个单独的线程中。唯一的问题是,如果失败,您需要记下作业详细信息并创建一个在启动时读取这些详细信息并恢复作业。这似乎很痛苦。

另一种方法是使用用户发出请求的队列,我们​​写入队列,然后从队列中读取并执行作业,并仅在作业完成时删除消息。这使得在启动时轻松恢复作业,因为服务器将在启动时从队列中读取并恢复该过程。

这种情况有没有更好的方法?

2 个答案:

答案 0 :(得分:1)

我会使用Quartz(具有故障转移功能)来管理您的工作。

PS:我宁愿错,但是,在阅读了你的上一个问题之后,我觉得你正在构建一些过于复杂或概念错误的东西。有太多的建筑气味恕我直言。

答案 1 :(得分:1)

鉴于您已指定REST,您显然拥有发出请求并需要结果的客户端。为什么不把确定他们是否已经完成客户端的责任。

e.g。客户提出请求。如果它得到了结果,一切都很好。但是,如果客户端检测到服务器已完成(通过HTTP连接过早断开连接),则它可以退回并稍后重试。如果您愿意,您可以实施各种重试策略(例如,在不同的主机上重试,在'n'重试后放弃等等。)

通过这种方式,客户可以了解他们需要什么(大概必须这样做),而且您的服务器是无状态的,这样更容易管理。