Quartz集群原理以及配置应用的方法详解

yizhihongxing

Quartz集群原理以及配置应用的方法详解

概述

Quartz是一个轻量级的、开源的、基于Java的调度框架,提供了很多调度的功能,比如创建多个定时任务、按照特定的规则执行任务、支持持久化、集群等。其中,Quartz集群支持多个应用实例共同组成一个调度集群,提高任务的可用性和可靠性。

Quartz集群原理

Quartz集群通过基于JDBC的持久化机制实现了数据共享,将JobDetail和Trigger存储在数据库中。多个应用实例通过定时查询数据库的方式获取需要执行的任务,确保每个任务只会在其中的一台机器上执行,从而实现任务的负载均衡和高可用。

配置应用的方法

步骤1:引入Quartz依赖

在pom.xml文件中加入以下依赖:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

步骤2:配置数据库

在程序入口处添加数据库配置:

private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/quartz?characterEncoding=UTF-8";
private static final String JDBC_USERNAME = "root";
private static final String JDBC_PASSWORD = "";

private static void initDatabase() {
    try {
        Class.forName(JDBC_DRIVER);
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
    StdSchedulerFactory factory = new StdSchedulerFactory();
    factory.initialize(getProperties());
}

private static Properties getProperties() {
    Properties props = new Properties();
    props.put("org.quartz.scheduler.instanceName", "quartzScheduler");
    props.put("org.quartz.scheduler.instanceId", "AUTO");
    props.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
    props.put("org.quartz.threadPool.threadCount", "10");

    props.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
    props.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
    props.put("org.quartz.jobStore.dataSource", "myDS");
    props.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
    props.put("org.quartz.jobStore.isClustered", "true");
    props.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
    props.put("org.quartz.jobStore.useProperties", "true");

    props.put("org.quartz.dataSource.myDS.driver", JDBC_DRIVER);
    props.put("org.quartz.dataSource.myDS.URL", JDBC_URL);
    props.put("org.quartz.dataSource.myDS.user", JDBC_USERNAME);
    props.put("org.quartz.dataSource.myDS.password", JDBC_PASSWORD);
    props.put("org.quartz.dataSource.myDS.maxConnections", "10");
    return props;
}

其中,quartzSchedulermyDS是自定义名称,可以根据自己的需要命名。

步骤3:编写Job类和Trigger类

通过实现Job接口来定义具体的任务:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello Quartz!");
    }
}

通过实现Trigger接口来定义任务的触发器:

public class MyTrigger {
    public static CronTrigger getCronTrigger(String cronExpression) {
        CronTriggerImpl trigger = new CronTriggerImpl();
        trigger.setCronExpression(cronExpression);
        trigger.setName("myTrigger");
        trigger.setGroup("myGroup");
        trigger.setJobKey(JobKey.jobKey("myJob", "myGroup"));
        return trigger;
    }
}

步骤4:启动多个应用实例

在多个应用实例中启动Quartz调度器:

public class QuartzServer {
    public static void main(String[] args) throws Exception {
        initDatabase();
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.clear();
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "myGroup")
                .build();
        CronTrigger trigger = MyTrigger.getCronTrigger("0/5 * * * * ? *");
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

注意,scheduler.clear()方法用于清除集群中已有的任务。

示例说明1:配置多个应用实例

假设现在有两台服务器A和B,需要配置成Quartz集群,其中A和B的配置文件中的数据库配置都相同,那么这两台服务器在Quartz集群中需要做如下配置:

  • 将A和B中JobDetail和Trigger存储在数据库中。
  • 设置两个应用实例的调度器名称quartzScheduler和实例IDAUTO相同。
  • 将A和B的线程池大小设置为相同的值。
  • 设置数据库的org.quartz.jobStore.isClustered属性为true
  • 启动A和B的应用实例。

示例说明2:使用Quartz集群

现在需要定时发送邮件,并且需要保证即使一台服务器出现故障,任务也能够继续执行。在这种情况下,可以使用Quartz集群来实现高可用性,保证任务的持续执行。在实现的过程中,需要参照上述步骤进行配置,并设置JobDetail和Trigger,同时需要让定时任务支持集群,具体实现方法如下:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        String jobId = context.getJobDetail().getKey().getName();
        String groupName = context.getJobDetail().getKey().getGroup();
        System.out.println("Hello Quartz! JobId=" + jobId + " groupName=" + groupName);
    }
}

public class MyTrigger {
    public static CronTrigger getCronTrigger(String cronExpression) {
        CronTriggerImpl trigger = new CronTriggerImpl();
        trigger.setCronExpression(cronExpression);
        trigger.setName("myTrigger");
        trigger.setGroup("myGroup");
        trigger.setJobKey(JobKey.jobKey("myJob", "myGroup"));
        trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
        trigger.setPriority(5);
        trigger.setJobData(createJobDataMap());
        return trigger;
    }

    private static JobDataMap createJobDataMap() {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("isClustered", true);
        return jobDataMap;
    }
}

在Trigger中,setMisfireInstruction方法用于设置Job的策略,setJobData方法用于设置Job数据映射表,在Job中可以通过context.getJobDetail().getJobDataMap().get("isClustered")获取Job信息。

结语

Quartz集群原理和配置应用方法相信通过上述内容已经有了一定的了解。在应用Quartz集群前,需要充分考虑任务的类型以及具体的业务场景,并根据实际情况进行灵活配置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Quartz集群原理以及配置应用的方法详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • SQL DELETE 和 TRUNCATE 的区别

    SQL中DELETE和TRUNCATE都是用来删除表中的数据。它们之间有细微的差别,下面将详细讲解它们的区别和使用场景。 DELETE DELETE用来删除表中的记录,可以满足精细的条件查询,可以只删除部分数据。 语法 DELETE FROM table_name WHERE condition; table_name : 要删除记录的表名。 conditi…

    database 2023年3月27日
    00
  • 分享3个MySQL查询容易踩的坑

    当你在使用MySQL时,可能会遇到一些困扰,以下是三个容易踩坑的MySQL查询: 1. 对空字符串进行匹配 在执行MySQL查询时,通常我们使用如下语法: SELECT * FROM table WHERE column = ‘value’; 然而,当column列中存储的数据内容为空字符串时,则需要使用不同的查询语法: SELECT * FROM tabl…

    database 2023年5月22日
    00
  • 搭建自己的PHP MVC框架详解

    搭建自己的 PHP MVC 框架非常有意义,它不仅可以让我们更好地理解 MVC 设计模式,还可以帮助我们更好地学习和掌握 PHP 技术栈。下面,我将详细讲解如何搭建自己的 PHP MVC 框架,包括以下步骤。 一、搭建框架目录结构 首先,我们需要搭建一个合适的目录结构。建议按照 MVC 设计模式的要求,将代码分为 Model、View 和 Controlle…

    database 2023年5月21日
    00
  • Windows下修改mysql的data文件夹存放位置的方法

    下面是“Windows下修改mysql的data文件夹存放位置的方法”的完整攻略。 1. 前置条件 首先,你需要在 Windows 系统上成功安装 MySQL,并且已经启动了 MySQL 服务。 2. 备份原始 data 文件夹 在进行任何修改之前,我们建议你先对原始的 data 文件夹进行备份,以防止数据丢失。 你可以通过以下命令来备份 data 文件夹:…

    database 2023年5月22日
    00
  • MySQL模糊查询语句整理集合

    MySQL模糊查询语句整理集合 在MySQL中,我们经常需要进行模糊查询来查找信息。这篇攻略将介绍MySQL中常用的模糊查询语句,包括LIKE、NOT LIKE、REGEXP等。 LIKE语句 LIKE语句是最常用的模糊查询语句之一。它可以匹配指定模式的字符串。 语法 SELECT column_name(s) FROM table_name WHERE c…

    database 2023年5月21日
    00
  • 单用户和多用户数据库系统的区别

    单用户数据库系统和多用户数据库系统都是常见的数据库系统,主要区别在于能够同时访问数据库的用户数量。以下是单用户和多用户数据库系统的详细讲解,包括各自的特点、优缺点和示例说明。 单用户数据库系统 单用户数据库系统指只能由单个用户进行操作,不能同时由多个用户进行访问和使用。这种数据库系统通常只限于个人使用或小型组织使用,例如小型企业、学校或家庭用户。 特点 只能…

    database 2023年3月27日
    00
  • 9种 MySQL数据库优化的技巧

    9种 MySQL数据库优化的技巧 MySQL是一款开源的关系型数据库管理系统,广泛用于互联网应用中。但是,如果不做好相应的优化,它的性能可能会受到严重的影响。下面是9种MySQL数据库优化的技巧,可以有效地提升系统的性能: 1. 设计良好的数据表结构 设计良好的表结构可以为系统提供更好的性能,具体包括以下方面: 合理使用数据类型,避免使用不必要的字段和重复的…

    database 2023年5月19日
    00
  • 在centos7上搭建mysql主从服务器的方法(图文教程)

    下面是搭建MySQL主从服务器的攻略。 1. 确认主从服务器的实现方式 MySQL主从服务器的实现方式一般有两种: 基于复制的主从服务器 基于半同步复制的主从服务器 基于复制的主从服务器实现简单,但是存在风险,例如主服务器出现宕机导致未同步的数据丢失。基于半同步复制的主从服务器实现较为稳定,但配置比较繁琐。 2. 配置主服务器 在CentOS 7上搭建MyS…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部