java – 如何优雅地处理数千个Quartz失火?

前端之家收集整理的这篇文章主要介绍了java – 如何优雅地处理数千个Quartz失火?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个需要的应用程序

>夜间重新处理大量的数据,和
>根据需要重新处理大量数据.

在这两种情况下,约有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();
原文链接:https://www.f2er.com/java/121035.html

猜你在找的Java相关文章