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

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数据操作语句

    浅析SQL数据操作语句 SQL是一种用于管理和操作关系型数据库的语言,通过SQL语句可以实现对数据库的增删改查操作。了解SQL数据操作语句,对于数据处理和数据分析有很大的帮助。下面我们来详细讲解一下SQL数据操作语句的完整攻略。 SQL语句的基本结构 SQL语句通常由关键字、操作对象和参数三部分组成。其中关键字是用来表示操作的行为,操作对象是待操作的数据表或…

    database 2023年5月21日
    00
  • MySQL 及 SQL 注入与防范方法

    MySQL 及 SQL 注入与防范方法 在讲解 MySQL 及 SQL 注入与防范方法之前,我们先来理解一下 MySQL 和 SQL。 MySQL 是一款开源的关系型数据库管理系统,被广泛应用于 Web 应用程序开发的数据存储。SQL(Structured Query Language)是一种专门用来访问和操作关系型数据库的语言。 SQL 注入攻击是指攻击者…

    database 2023年5月22日
    00
  • MySQL时间格式化date_format使用语法

    MySQL中的date_format函数可以将日期时间类型的数据格式化为字符串。其基本语法如下: date_format(date, format) 其中,date是日期时间类型的数据(比如datetime、timestamp等),format是指定的日期时间输出格式。 format参数可以使用各种格式化符号,具体使用方式如下: 格式化符号 含义 %Y 年份…

    database 2023年5月22日
    00
  • 深入了解MySQL中索引优化器的工作原理

    深入了解 MySQL 中索引优化器的工作原理 MySQL 的索引优化器负责选择查询语句中最合适的索引来加速查询操作。在了解索引优化器工作原理之前,我们需要先了解几个概念: 索引类型 MySQL 支持多种不同类型的索引,包括 B-Tree、Hash、Full-text 等。其中 B-Tree(B树)是最常见的一种索引类型。B-Tree 索引在处理大量数据和范围…

    database 2023年5月19日
    00
  • asp.net无法加载oci.dll等错误的解决方法

    请看以下内容: ASP.NET无法加载oci.dll等错误的解决方法 在ASP.NET开发中,我们可能会遇到类似“无法加载oci.dll”、“无法加载oraocci11.dll”、“无法加载Oracle.DataAccess.dll”等错误。这些错误通常是由Oracle客户端库(ODAC)没有正确安装或配置引起的。下面是解决这些问题的一些方法。 1. 安装或…

    database 2023年5月21日
    00
  • 为PHP模块添加SQL SERVER2012数据库的步骤详解

    为PHP模块添加SQL SERVER2012数据库需要以下几个步骤: 步骤一:安装SQL Server Extension 在PHP的官网下载SQL Server Extension对应版本的连接器,并放置于PHP安装目录下的ext文件夹中。这个步骤的示例代码如下: # 下载Microsoft官方DLL curl -L https://github.com/…

    database 2023年5月22日
    00
  • 利用Angularjs和Bootstrap前端开发案例实战

    为了更好的说明“利用Angularjs和Bootstrap前端开发案例实战”的完整攻略,我准备将其分为以下三个部分来详细讲解: 环境搭建 AngularJS和Bootstrap的常用操作及使用方法 国内外常见的案例实战示例说明 一. 环境搭建 为了进行该项目的开发,我们需要搭建一个包含AngularJS和Bootstrap的环境。这里我们可以使用一些主流的开…

    database 2023年5月21日
    00
  • DBMS 冲突可串行化

    DBMS中的冲突可串行化是指在多用户同时访问数据库时,如果同时进行的事务之间存在冲突,系统仍能保证事务执行的结果与串行执行的结果相同。具体来说,就是通过控制并发事务的并发度,保证多个事务之间的冲突能够被逐一消解,从而实现事务的可串行化。 下面是实现冲突可串行化的一些基本步骤: 识别冲突项:识别出事务之间可能出现的冲突项,如数据顺序、加锁、共享锁等。 定义冲突…

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