8

我知道这对兵马俑是不公平的,但是有没有人尝试使用 Hazelcast 来在集群环境中使用预定的作业?

我可以想象的最简单的实现是以下架构:

  1. 全局 Hazelcast 锁,用于确保只有一台服务器启动 Quartz 配置。
  2. 将实际任务作为 DistributedTask 运行。(这可以稍后完成,目前繁重的计划任务需要处理触发 DistributedTask)
  3. 一旦持有锁的服务器关闭,另一台服务器就会获得锁。

我相信这对于已经拥有 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 扩展:

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/HazelcastRAMJobStore.java

这是 Spring SchedulerFactoryBean 扩展:

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/SchedulerFactoryBean.java

4

2 回答 2

9

前段时间我也在考虑同样的概念。您实际上可以通过实现SPI 接口轻松Hazelcast集成。查看有关如何基于内存数据结构和集群、数据库支持的存储实现作业存储的参考资料。quartz-schedulerJobStoreRAMJobStoreJobStoreTX

这个界面相当大,但它应该是从 RAM 或 Terracotta 切换到 Hazelcast 所需的唯一地方。后一个库已经提供了分布式存储和锁,所以它应该相当简单。

如果你能分享你的实现(GitHub?),那就太棒了,猜猜对于许多人来说,这将是一个可行的 Terracotta 集群替代方案。

于 2012-06-21T15:50:56.983 回答
4

从版本开始,3.8您可以简单地使用分布式Scheduled Executor Service

  • scheduleOnMember()
  • scheduleOnKeyOwner()
  • scheduleOnAllMembers()
  • scheduleOnAllMembers()

请参阅计划执行服务IScheduledExecutorService更多详细信息。

于 2017-03-26T17:10:30.797 回答