>夜间重新处理大量的数据,和
>根据需要重新处理大量数据.
在这两种情况下,约有10,000个石英作业产生并运行.在夜间情况下,我们有一个石英cron工作,可以产生10,000个作业,每个作业单独处理数据的工作.
我们的问题是,我们正在运行大约30个线程,所以石英工作当然会失火,并继续失火直到一切都被处理.处理时间长达6小时.这10,000个作业中的每一个涉及可以并行处理并且完全独立的特定域对象. 10,000个作业中的每一个可以花费可变的时间(从半秒到一分钟).
我的问题是:
有没有更好的方法来做到这一点?
>如果没有,我们最好的方法是安排/设置我们的石英工作,以便花费最少的时间花钱和处理失火.
一个关于或架构的注释:我们运行两个三个节点的集群.石英版本有点旧(2.0.1),并且在quartz.properties文件中启用了聚类.
解决方法
In both of these cases,around 10,000 quartz jobs get spawned
不需要产生新的石英作业. Quartz是一个调度程序,而不是任务管理器.
在夜间重新处理中 – 您只需要一个石英cron作业来调用一些负责管理和运行10,000个任务的服务.在“按需”的情况下,石英不应该参与其中.直接调用该服务.
该服务如何管理10,000个任务?
通常情况下,当只有一个JVM可用时,您只需使用一些ExecutorService
.这里,由于您的手指下有6个节点,您可以轻松使用Hazelcast. Hazelcast是一个可用于集群节点,可以共享资源的java库与对方Hazelcast有一个简单的解决方案,用于分发您的ExecutorService,即Distributed Executor Service.这与创建Hazelcast ExecutorService和submitting the task on all members一样简单.以下是the documentation在一个成员上调用的示例:
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();