搜索通用异步Java作业执行框架/库
-
03-07-2019 - |
题
我正在寻找一个通用的异步Java作业执行框架,它可以处理 Callable
或 Runnable
。它类似于 java.util.concurrent.ExecutorService
,(可能包装 ExecutorService
),但它也有以下功能:
-
在作业服务期间应用程序停机时能够将作业持久保存到数据库,并能够重新启动未完成的作业。 (我知道我的工作可能必须实现
Serializable
,这没关系。) -
使用UUID使客户端能够获取作业令牌并查询作业状态。 (在引擎盖下,此信息也将保留在数据库中。)
醇>
我已经开始围绕 ExecutorService
开始研究这个问题,但我更喜欢开箱即用的开源解决方案,如果存在的话。
可以在Spring Framework中运行的东西是理想的。
其他提示
您可以查看 Quartz 。
Quartz是一个功能齐全的开源作业调度系统,可以与最小的独立应用程序集成,或者与几乎任何J2EE或J2SE应用程序一起使用 - 从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业;任务被定义为标准Java组件或EJB的作业。 Quartz Scheduler包含许多企业级功能,例如JTA事务和集群。
查看 http://www.opensymphony.com/quartz/wikidocs /Features.html ,看看它是否已经适合您。
从该页面开始:
使用包含的JDBCJobStore,将所有作业和触发器配置为“非易失性”。通过JDBC
存储在关系数据库中
另一个方向可能是使用 Terracotta ,它能够在您的JVM中集群堆并将其保留为可用性。如果从调度的角度来看,Terracotta支持与 Quartz 集成。此外,还有一个主人和消息可能集成模块也很有用。 Terracotta是开源的。
为了跟进Alex的观点,Terracotta解决方案不会将您的工作持久存储到数据库中,它们会在Terracotta分布式存储器中持久存在。
由于Terracotta将内存存储器保存到磁盘,因此这是将这些作业放入数据库的更高效版本。
同时,它为您提供了纯粹的POJO编程模型,因此您甚至不必处理数据库txns,ORM等 - 除非您的特定工作负载恰好与数据库通信(在这种情况下,兵马俑)在这里没有帮助或伤害你,它只是帮助分发工作)。
MasterWorker模式将帮助您在网格上分发工作,您可以非常轻松地开始使用DistributedExecutorService,提交工作如下所示:
CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();
以下是主工作人员快速入门指南的链接在Terracotta Forge上实施。
更重要的是 - Terracotta不要求你实现Serializable - 尽管你可以这样做:)