如何优雅地处理成千上万的石英失火?

Bre*_*ain 11 java multithreading quartz-scheduler java-ee

我们有一个需要的应用程序

  1. 每晚重新处理大量数据,以及

  2. 按需重新处理大量数据.

在这两种情况下,大约10,000个石英作业产生然后运行.在每晚的情况下,我们有一个石英cron作业产生10,000个作业,每个作业分别处理数据.

我们遇到的问题是我们运行了大约30个线程,因此石英工作自然会失败,并且在处理完所有事情之前继续熄火.处理最多可能需要6个小时.这10,000个作业中的每一个都属于可以并行处理且完全独立的特定域对象.10,000个工作中的每一个都可以花费不同的时间(从半秒到一分钟).

我的问题是:

  1. 有一个更好的方法吗?

  2. 如果没有,我们安排/设置石英作业的最佳方式是什么,以便花费最少的时间来捶打和处理失火?

关于或架构的说明:我们正在运行两个集群,每个集群有三个节点.quartz的版本有点旧(2.0.1),并且在quartz.properties文件中启用了聚类.

yai*_*air 8

在这两种情况下,大约有10,000个石英作业产生

无需产生新的石英作业.Quartz是一个调度程序 - 而不是任务管理器.

在夜间重新处理中 - 您只需要一个石英cron作业来调用一些负责管理和运行10,000个任务的服务.在"按需"场景中,石英根本不应该参与其中.只需直接调用该服务即可.

该服务如何管理10,000个任务?

通常,只有一个JVM可用时,您只需使用一些JVM ExecutorService.在这里,由于手指下有6个节点,因此您可以轻松使用Hazelcast.Hazelcast是一个java库,使您可以集群节点,相互有效地共享资源.Hazelcast有一个简单的解决方案来分发你的ExecutorService,这就是所谓的分布式执行器服务.这是因为创建Hazelcast容易ExecutorService所有成员提交任务.以下是调用单个成员的文档中的示例:

Callable<String> task = new Echo(input); // Echo is just some Callable
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
IExecutorService executorService = hz.getExecutorService("default");
Future<String> future = executorService.submitToMember(task, member);
String echoResult = future.get();
Run Code Online (Sandbox Code Playgroud)