我知道这对 terracotta 家伙不公平,但是有没有人尝试使用 Hazelcast 以便在集群环境中使用预定作业?
我能想到的最简单的实现是以下架构:
- 用于确保只有一台服务器启动 Quartz 配置的全局 Hazelcast 锁。
- 将实际任务作为 DistributedTask 运行。 (这可以稍后完成,目前繁重的计划任务需要负责触发 DistributedTask)
- 持有锁的服务器一旦关闭,另一台服务器就会获得锁。
我相信这对于已经拥有 Hazelcast 的人来说是一个很大的优势,因为他们不需要一直打开 terracotta 东西来处理整个开发环境的麻烦。
目前我编写了最简单的解决方案,即只让一个节点负责执行 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 扩展:
最佳答案
我前段时间也在思考同样的概念。实际上,您可以通过实现 JobStore
SPI 接口(interface)轻松地将 Hazelcast
与 quartz-scheduler
集成。查看RAMJobStore
引用如何基于内存数据结构和 JobStoreTX
实现作业存储- 集群化、数据库支持的存储。
这个界面相当大,但它应该是唯一需要从 RAM 或 Terracotta 切换到 Hazelcast 的地方。后一个库已经提供了分布式存储和锁,因此它应该相当简单。
如果您能分享您的实现(GitHub?),那就太棒了,我想对于很多人来说,这将是 Terracotta 集群的可行替代方案。
关于java - Hazelcast 预定作业(支持 Quartz?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129896/