作业排队和执行机制

时间:2010-05-18 13:16:01

标签: java spring

在我的webservice中,所有方法调用都将作业提交到队列。基本上这些操作需要很长时间才能执行,因此所有这些操作都会将一个Job提交到队列并返回一个状态“Submitted”。然后,客户端使用其他服务方法继续轮询以检查作业的状态。

目前,我所做的是创建自己的Queue,Job类,它们是Serializable并将这些作业(即它们的序列化字节流格式)保存到数据库中。因此,UpdateLogistics操作只是将“UpdateLogisticsJob”排队到队列并返回。我编写了自己的JobExecutor,每隔N秒唤醒一次,扫描数据库表中的任何现有作业,并执行它们。请注意,作业必须保持不变,因为这些作业必须能够应对服务器崩溃。

这是很久以前完成的,我为我的队列,工作,执行官等使用了定制课程。但是现在,我想知道有人之前做过类似的事吗?特别是,

  • 是否有可用的框架? Spring / Apache等中的东西
  • 任何易于调整和调试的框架以及像Spring这样的库都能很好地运行。

编辑 - 石英

很抱歉,如果我没有解释更多,Quartz对于无状态工作(以及一些有状态的工作)也很有用,但对我而言,关键是非常有状态的“工作实例”(不仅仅是工作或任务)。因此,例如executeWorkflow("SUBMIT_LEAVE")的操作实际上可能会创建5个作业实例,每个作业实例都有至少5-10个参数,例如userId,accountId等,以保存到数据库中。

我在该区域寻找一些支持,可以将Job实例保存到数据库并重新创建等等吗?

5 个答案:

答案 0 :(得分:2)

看看JBoss jBPM。它是一个工作流定义包,可让您混合自动和手动流程。任务被持久化到数据库后端,看起来它具有some asynchronous执行属性。

答案 1 :(得分:0)

我很久没有使用Quartz,但我怀疑它能够做你想做的一切。

答案 2 :(得分:0)

spring-batch plus quartz

答案 3 :(得分:0)

根据作业的性质,您还可以查看spring-integration以协助进行队列处理。但spring-batch可能会处理您的大部分要求。

答案 4 :(得分:0)

请尝试 ted-driver https://github.com/labai/ted

它的目的与您需要的类似-创建任务(或其中的许多任务),将其保存在db中,然后由 ted-driver 负责执行该任务。如果发生错误,您可以将重试推迟到以后再执行,或者以状态错误结束。

与其他Java框架不同,这里的任务在数据库中具有简单明了的结构,您可以在其中使用标准sql进行手动搜索或更新。