java - Hazelcast 预定作业(支持 Quartz?)

标签 java spring quartz-scheduler terracotta hazelcast

我知道这对 terracotta 家伙不公平,但是有没有人尝试使用 Hazelcast 以便在集群环境中使用预定作业?

我能想到的最简单的实现是以下架构:

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

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

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

最佳答案

我前段时间也在思考同样的概念。实际上,您可以通过实现 JobStore SPI 接口(interface)轻松地将 Hazelcastquartz-scheduler 集成。查看RAMJobStore引用如何基于内存数据结构和 JobStoreTX 实现作业存储- 集群化、数据库支持的存储。

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

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

关于java - Hazelcast 预定作业(支持 Quartz?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129896/

相关文章:

java - 两个 double 组相等

java - Android subview 在父 Activity 的 onActivityResult 中为空

java - 使用 spring restTemplate 对 REST API 进行基本身份验证

java - 属性文件中的常量

java - JSF 2 - 在 <? 上隐藏默认值扩展号码>

java - android < 2.3 和 java.text.Normalizer

Spring Boot - Spring组件中的@Configuration类为null

java - 如何在运行时更改 Camel quartz 时间

java - 创建一个在一周中的特定日期执行的触发器(Quartz Scheduler API)

grails - 单个Quartz作业中有多个触发器/Cron表达式