我正在寻找一个通用的异步Java作业执行框架,它可以处理 Callable Runnable 。它类似于 java.util.concurrent.ExecutorService ,(可能包装 ExecutorService ),但它也有以下功能:

  1. 在作业服务期间应用程序停机时能够将作业持久保存到数据库,并能够重新启动未完成的作业。 (我知道我的工作可能必须实现 Serializable ,这没关系。)

  2. 使用UUID使客户端能够获取作业令牌并查询作业状态。 (在引擎盖下,此信息也将保留在数据库中。)

  3. 我已经开始围绕 ExecutorService 开始研究这个问题,但我更喜欢开箱即用的开源解决方案,如果存在的话。

    可以在Spring Framework中运行的东西是理想的。

有帮助吗?

解决方案

您可以使用 Quartz ,并创建具体的 作业 适配器,委托给 Runnable Callable 。 Quartz' Job 接口增加了在任务调用之间维护某些状态的能力。如果需要,Quartz可以将作业及其状态持久存储在关系数据库中,并在可扩展的主机群集上执行它们。

其他提示

您可以查看 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 - 尽管你可以这样做:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top