在我的webservice中,所有方法调用都将作业提交到队列。基本上这些操作需要很长时间才能执行,因此所有这些操作都会将一个Job提交到队列并返回一个状态“Submitted”。然后,客户端使用其他服务方法继续轮询以检查作业的状态。
目前,我所做的是创建自己的Queue,Job类,它们是Serializable并将这些作业(即它们的序列化字节流格式)保存到数据库中。因此,UpdateLogistics操作只是将“UpdateLogisticsJob”排队到队列并返回。我编写了自己的JobExecutor,每隔N秒唤醒一次,扫描数据库表中的任何现有作业,并执行它们。请注意,作业必须保持不变,因为这些作业必须能够应对服务器崩溃。
这是很久以前完成的,我为我的队列,工作,执行官等使用了定制课程。但是现在,我想知道有人之前做过类似的事吗?特别是,
编辑 - 石英
很抱歉,如果我没有解释更多,Quartz对于无状态工作(以及一些有状态的工作)也很有用,但对我而言,关键是非常有状态的“工作实例”(不仅仅是工作或任务)。因此,例如executeWorkflow("SUBMIT_LEAVE")
的操作实际上可能会创建5个作业实例,每个作业实例都有至少5-10个参数,例如userId,accountId等,以保存到数据库中。
我在该区域寻找一些支持,可以将Job实例保存到数据库并重新创建等等吗?
答案 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进行手动搜索或更新。