我知道这对兵马俑是不公平的,但是有没有人尝试使用 Hazelcast 来在集群环境中使用预定的作业?
我可以想象的最简单的实现是以下架构:
- 全局 Hazelcast 锁,用于确保只有一台服务器启动 Quartz 配置。
- 将实际任务作为 DistributedTask 运行。(这可以稍后完成,目前繁重的计划任务需要处理触发 DistributedTask)
- 一旦持有锁的服务器关闭,另一台服务器就会获得锁。
我相信这对于已经拥有 Hazelcast 的人来说将是一个很大的优势,因为他们不需要通过一直打开兵马俑的东西来解决整个开发环境的麻烦。
目前,我编写了最简单的解决方案,即只让一个节点负责执行 Quartz 触发器。由于我只使用类似 Cron 的触发器,因此如果我负责为繁重的触发器任务创建 DistributedTasks,它可能是一个可接受的解决方案。
这是实现它的我的 org.springframework.scheduling.quartz.SchedulerFactoryBean 扩展:
@Override
public void start() throws SchedulingException {
new Thread(new Runnable() {
@Override
public void run() {
final Lock lock = getLock();
lock.lock();
log.warn("This node is the master Quartz");
SchedulerFactoryBean.super.start();
}
}).start();
log.info("Starting..");
}
@Override
public void destroy() throws SchedulerException {
super.destroy();
getLock().unlock();
}
请让我知道我是否遗漏了一些重要的东西,如果可以做到这一点。
我已将这两个文件添加到 github。这是 RAMJobStore 扩展:
这是 Spring SchedulerFactoryBean 扩展: