zoukankan      html  css  js  c++  java
  • Quartz集群

    前言

    前面说到过项目使用到了Quartz,当项目部署到多节点后,同样的调度任务会被重复执行,这时候就需要用到集群了。

    集群配置

    quartz.properties

    #============================================================================
    # Configure Main Scheduler Properties
    #============================================================================
    org.quartz.scheduler.instanceName = me
    #ID设置为自动获取,每一个必须不同
    org.quartz.scheduler.instanceId = AUTO
    
    #============================================================================
    # Configure ThreadPool
    #============================================================================
    #ThreadPool 实现的类名
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount = 2
    #线程优先级
    org.quartz.threadPool.threadPriority = 5
    
    #============================================================================
    # Configure JobStore
    #============================================================================
    #数据保存方式为持久化
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.misfireThreshold = 60000
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.useProperties = false
    org.quartz.jobStore.tablePrefix = QRTZ_
    org.quartz.jobStore.dataSource = myDS
    org.quartz.jobStore.isClustered = true
    org.quartz.jobStore.clusterCheckinInterval = 10000
    
    #============================================================================
    # Configure DataSource
    #============================================================================
    
    org.quartz.dataSource.myDS.driver= com.mysql.jdbc.Driver
    org.quartz.dataSource.myDS.URL= @db.url@
    org.quartz.dataSource.myDS.user= @db.username@
    org.quartz.dataSource.myDS.password= @db.password@
    org.quartz.dataSource.myDS.maxConnections= 5
    org.quartz.dataSource.myDS.validationQuery=select 0 from dual

    mysql数据库脚本

    drop table if exists qrtz_fired_triggers;
    drop table if exists qrtz_paused_trigger_grps;
    drop table if exists qrtz_scheduler_state;
    drop table if exists qrtz_locks;
    drop table if exists qrtz_simple_triggers;
    drop table if exists qrtz_simprop_triggers;
    drop table if exists qrtz_cron_triggers;
    drop table if exists qrtz_blob_triggers;
    drop table if exists qrtz_triggers;
    drop table if exists qrtz_job_details;
    drop table if exists qrtz_calendars;
    
    create table qrtz_job_details(
      sched_name varchar(120) not null,
      job_name varchar(200) not null,
      job_group varchar(200) not null,
      description varchar(250) null,
      job_class_name varchar(250) not null,
      is_durable varchar(1) not null,
      is_nonconcurrent varchar(1) not null,
      is_update_data varchar(1) not null,
      requests_recovery varchar(1) not null,
      job_data blob null,
      primary key (sched_name,job_name,job_group))
      engine=innodb;
    
    create table qrtz_triggers (
      sched_name varchar(120) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      job_name varchar(200) not null,
      job_group varchar(200) not null,
      description varchar(250) null,
      next_fire_time bigint(13) null,
      prev_fire_time bigint(13) null,
      priority integer null,
      trigger_state varchar(16) not null,
      trigger_type varchar(8) not null,
      start_time bigint(13) not null,
      end_time bigint(13) null,
      calendar_name varchar(200) null,
      misfire_instr smallint(2) null,
      job_data blob null,
      primary key (sched_name,trigger_name,trigger_group),
      foreign key (sched_name,job_name,job_group)
      references qrtz_job_details(sched_name,job_name,job_group))
      engine=innodb;
    
    create table qrtz_simple_triggers (
      sched_name varchar(120) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      repeat_count bigint(7) not null,
      repeat_interval bigint(12) not null,
      times_triggered bigint(10) not null,
      primary key (sched_name,trigger_name,trigger_group),
      foreign key (sched_name,trigger_name,trigger_group)
      references qrtz_triggers(sched_name,trigger_name,trigger_group))
      engine=innodb;
    
    create table qrtz_cron_triggers (
      sched_name varchar(120) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      cron_expression varchar(120) not null,
      time_zone_id varchar(80),
      primary key (sched_name,trigger_name,trigger_group),
      foreign key (sched_name,trigger_name,trigger_group)
      references qrtz_triggers(sched_name,trigger_name,trigger_group))
      engine=innodb;
    
    create table qrtz_simprop_triggers
    (
      sched_name varchar(120) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      str_prop_1 varchar(512) null,
      str_prop_2 varchar(512) null,
      str_prop_3 varchar(512) null,
      int_prop_1 int null,
      int_prop_2 int null,
      long_prop_1 bigint null,
      long_prop_2 bigint null,
      dec_prop_1 numeric(13,4) null,
      dec_prop_2 numeric(13,4) null,
      bool_prop_1 varchar(1) null,
      bool_prop_2 varchar(1) null,
      primary key (sched_name,trigger_name,trigger_group),
      foreign key (sched_name,trigger_name,trigger_group)
      references qrtz_triggers(sched_name,trigger_name,trigger_group))
      engine=innodb;
    
    create table qrtz_blob_triggers (
      sched_name varchar(120) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      blob_data blob null,
      primary key (sched_name,trigger_name,trigger_group),
      index (sched_name,trigger_name, trigger_group),
      foreign key (sched_name,trigger_name,trigger_group)
      references qrtz_triggers(sched_name,trigger_name,trigger_group))
      engine=innodb;
    
    create table qrtz_calendars (
      sched_name varchar(120) not null,
      calendar_name varchar(200) not null,
      calendar blob not null,
      primary key (sched_name,calendar_name))
      engine=innodb;
    
    create table qrtz_paused_trigger_grps (
      sched_name varchar(120) not null,
      trigger_group varchar(200) not null,
      primary key (sched_name,trigger_group))
      engine=innodb;
    
    create table qrtz_fired_triggers (
      sched_name varchar(120) not null,
      entry_id varchar(95) not null,
      trigger_name varchar(200) not null,
      trigger_group varchar(200) not null,
      instance_name varchar(200) not null,
      fired_time bigint(13) not null,
      sched_time bigint(13) not null,
      priority integer not null,
      state varchar(16) not null,
      job_name varchar(200) null,
      job_group varchar(200) null,
      is_nonconcurrent varchar(1) null,
      requests_recovery varchar(1) null,
      primary key (sched_name,entry_id))
      engine=innodb;
    
    create table qrtz_scheduler_state (
      sched_name varchar(120) not null,
      instance_name varchar(200) not null,
      last_checkin_time bigint(13) not null,
      checkin_interval bigint(13) not null,
      primary key (sched_name,instance_name))
      engine=innodb;
    
    create table qrtz_locks (
      sched_name varchar(120) not null,
      lock_name varchar(40) not null,
      primary key (sched_name,lock_name))
      engine=innodb;
    
    create index idx_qrtz_j_req_recovery on qrtz_job_details(sched_name,requests_recovery);
    create index idx_qrtz_j_grp on qrtz_job_details(sched_name,job_group);
    
    create index idx_qrtz_t_j on qrtz_triggers(sched_name,job_name,job_group);
    create index idx_qrtz_t_jg on qrtz_triggers(sched_name,job_group);
    create index idx_qrtz_t_c on qrtz_triggers(sched_name,calendar_name);
    create index idx_qrtz_t_g on qrtz_triggers(sched_name,trigger_group);
    create index idx_qrtz_t_state on qrtz_triggers(sched_name,trigger_state);
    create index idx_qrtz_t_n_state on qrtz_triggers(sched_name,trigger_name,trigger_group,trigger_state);
    create index idx_qrtz_t_n_g_state on qrtz_triggers(sched_name,trigger_group,trigger_state);
    create index idx_qrtz_t_next_fire_time on qrtz_triggers(sched_name,next_fire_time);
    create index idx_qrtz_t_nft_st on qrtz_triggers(sched_name,trigger_state,next_fire_time);
    create index idx_qrtz_t_nft_misfire on qrtz_triggers(sched_name,misfire_instr,next_fire_time);
    create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(sched_name,misfire_instr,next_fire_time,trigger_state);
    create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(sched_name,misfire_instr,next_fire_time,trigger_group,trigger_state);
    
    create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(sched_name,instance_name);
    create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(sched_name,instance_name,requests_recovery);
    create index idx_qrtz_ft_j_g on qrtz_fired_triggers(sched_name,job_name,job_group);
    create index idx_qrtz_ft_jg on qrtz_fired_triggers(sched_name,job_group);
    create index idx_qrtz_ft_t_g on qrtz_fired_triggers(sched_name,trigger_name,trigger_group);
    create index idx_qrtz_ft_tg on qrtz_fired_triggers(sched_name,trigger_group);

    原理

    Quartz实现集群的原理就是将各个任务持久化到数据库,每个节点根据数据库的记录来判断是否需要执行调度任务。

    所以,任务相关的类都需要实现Serializable接口,来进行序列化和反序列化。

  • 相关阅读:
    前端工具Gulp的学习
    研究javascript中的this
    如何让引入ES6的html文件运行起来
    windows用命令方式查看文件内容
    windows中用'ls'命令查看项目目录
    一步步理解ajax
    【拥抱ES6】搭建一个ES6环境
    npm还是cnpm
    【聊一聊】css中的经典布局——圣杯布局
    【聊一聊】css中的经典布局——双飞翼布局
  • 原文地址:https://www.cnblogs.com/irain/p/7458751.html
Copyright © 2011-2022 走看看