当前位置: 首页 > 知识库问答 >
问题:

Hazelcast计划作业(石英支持?)

柳鸿信
2023-03-14

我知道这对terracotta的人来说是不公平的,但是有人尝试过使用Hazelcast在集群环境中使用计划作业吗?

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

  1. 全局黑泽尔铸造锁,用于确保只有一台服务器启动了 Quartz 配置。
  2. 以分布式任务的形式运行实际任务。(这可以在以后完成,目前繁重的计划任务将需要处理触发分布式任务)
  3. 一旦持有锁的服务器关闭,另一台服务器就会获得锁。

我相信对于已经拥有Hazelcast的人来说,这将是一个很大的优势,因为他们不需要通过一直打开兵马俑的东西来麻烦整个开发环境。

目前,我已经编写了最简单的解决方案,只让一个节点负责执行Quartz触发器。由于我只使用类似Cron的触发器,如果我负责为繁重的触发器任务创建分布式任务,这可能是一个可以接受的解决方案。

下面是我的org . spring framework . 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-hazel cast/blob/master/src/main/Java/com/mufumbo/server/scheduler/hazel cast/hazelcastramjobstore . Java

这是Spring SchedulerFactoryBean扩展:

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

共有2个答案

鞠源
2023-03-14

从< code>3.8版开始,您可以简单地使用分布式< code >预定执行器服务:

  • scheduleonmember()
  • scheduleOnKeyOwner()
  • 计划所有会员()
  • 计划所有会员()

有关更多详细信息,请参阅计划执行器服务和IScheduledExecutorService

督烨赫
2023-03-14

我前段时间也在想同样的概念。你实际上可以通过实现JobStoreSPI接口轻松地将Hazelcast石英调度器集成在一起。关于如何实现基于内存数据结构的作业存储和JobStoreTX-集群的、数据库支持的存储,请查看RAMJobStore以供参考。

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

如果你能分享你的实现(GitHub?),对于许多人来说,这可能是兵马俑集群的可行替代品。

 类似资料:
  • 我正在使用一个使用Java的Quartz调度器。即使计划的时间已经过了,它也不会抛出调度器异常,而是现在运行作业。例如,我确认了一个作业是10月10日,今天是10月30日,如果我保存信息,它现在就运行作业本身 此外,我还使用JobListener实现手动触发一个作业,以便以后在同一时间点运行其他作业的情况下对其进行调度。 请帮忙。

  • 我需要在工作日的特定时间触发一份工作。这些工作日也是动态的,应该从db获取。此外,对于特定的计数,作业应该触发或重复自己。假设一个工作j应该在每一个星期一,星期三,星期五触发,重复计数15即3*5=15,所以它应该在接下来的3周内触发。 我尝试使用如下所示的cronexpression,但无法找到如何在特定计数后阻止作业触发。 请给我一些建议,这样我就能达到我所需要的。

  • 是否可以添加/删除/修改在Quartz Spring Boot中动态安排的作业(在运行时),由使用我的门户的最终用户。由于计划无法从外部访问,我不知道有什么办法。基本上,我需要将所有的时间表信息存储到数据库中并访问它们。Im构建的门户将被大量用户使用,实现这一目标的正确解决方案是什么? 否则我可以像下面这样使用cron吗 每5 mns扫描一次作业以实现此目的。

  • 我正在使用quartz调度器来调度一个Spring批处理作业。应用程序启动时没有任何异常,但它从不激发任何作业。 它运行得很成功,但经过更多的开发后,它停止了工作。我无法弄清楚我到底改变了什么配置导致了这一点。 有谁可以建议检查点在使用“JobRepositoryFactoryBean”,如果我没有或问题在其他地方。

  • 使用spring 2.5和quartz 1.6.2,我一直试图每分钟触发一个计划任务 我的xml文件是: 我的代码是:

  • 我有一个Sprint Boot-Java8应用程序,它有一个quartz作业,我在启动时配置该作业并设置一个时间表。该作业按照计划自动运行,这与您对quartz作业的期望一样。然而,现在我希望能够允许用户通过点击前端上的一个按钮手动触发这些作业,而不会扰乱该作业的正常调度。这是我所有的相关档案。 但每次运行应用程序并点击控制器的方法时,都会在控制台中出现以下错误: 我到底做错了什么?如何使此作业按