5

我正在寻找可以处理Callables 或Runnables 的通用异步 Java 作业执行框架。它类似于java.util.concurrent.ExecutorService, (也可能是 wrap ExecutorService),但它还具有以下特性:

  1. 将作业持久化到数据库的能力,以防应用程序在为作业提供服务时出现故障,并且能够重新启动未完成的作业。(我知道我的工作可能必须执行Serializable,这是可以的。)

  2. 使用 UUID 使客户端能够获取作业令牌并查询作业状态。(在后台,这些信息也将保存到数据库中。)

我已经开始自己通过构建来解决这个问题ExecutorService,但我更喜欢开箱即用的开源解决方案,如果存在的话。

可以在 Spring 框架中工作的东西将是理想的。

4

5 回答 5

8

你可能想看看Quartz

Quartz 是一个功能齐全的开源作业调度系统,可以与几乎任何 J2EE 或 J2SE 应用程序集成或一起使用——从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的调度,以执行数十、数百甚至数万个作业;任务被定义为标准 Java 组件或 EJB 的作业。Quartz Scheduler 包括许多企业级功能,例如 JTA 事务和集群。

于 2009-03-04T22:08:01.433 回答
3

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

于 2009-03-04T22:08:30.107 回答
2

看看http://www.opensymphony.com/quartz/wikidocs/Features.html看看它是否已经为你准备好了。

从该页面:

通过使用包含的 JDBCJobStore,所有配置为“非易失性”的作业和触发器都通过 JDBC 存储在关系数据库中

于 2009-03-04T22:10:06.360 回答
2

另一个方向可能是使用Terracotta,它能够在 JVM 中集群堆并将其持久化以确保可用性。如果从调度的角度来看这是有用的,Terracotta 支持与Quartz的集成。此外,还有一个主从器和消息传递集成模块也可能有用。Terracotta 是开源的。

于 2009-03-05T03:00:33.197 回答
2

为了跟进 Alex 的观点,Terracotta 解决方案不会将您的作业持久化到数据库中,它们将持久化在 Terracotta 分布式内存存储中。

由于 Terracotta 将内存存储持久化到磁盘,因此这是将这些作业放入数据库的更有效版本。

同时,它为您提供了一个纯 POJO 编程模型,因此您甚至不必处理 DB txns、ORM 等 - 除非您的特定工作负载碰巧与 DB 对话(在这种情况下,Terracotta 不会在这里帮助或伤害你,它只是帮助分配工作)。

MasterWorker 模式将帮助您在网格上分配工作,您可以非常轻松地开始使用 DistributedExecutorService,提交工作如下所示:

CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();

这是 Terracotta Forge 上 master-worker 实现中快速入门指南的链接。

更重要的是 - Terracotta 不需要你实现 Serializable - 虽然你可以如果你想:)

于 2009-03-06T19:29:18.693 回答