程序笔记   发布时间:2022-07-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Quartz分布式定时任务执行和调度大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

Quartz分布式定时任务执行和调度

0.创建数据库表

#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAm.

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(190) NOT NULL,
JOB_GROUP VARCHAR(190) 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(190) NOT NULL,
trigGER_GROUP VARCHAR(190) NOT NULL,
JOB_name varchar(190) NOT NULL,
JOB_GROUP VARCHAR(190) 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(190) 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(190) NOT NULL,
trigGER_GROUP VARCHAR(190) 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(190) NOT NULL,
trigGER_GROUP VARCHAR(190) 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(190) NOT NULL,
    trigGER_GROUP VARCHAR(190) 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(190) NOT NULL,
trigGER_GROUP VARCHAR(190) 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(190) 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(190) 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(190) NOT NULL,
trigGER_GROUP VARCHAR(190) NOT NULL,
INSTANCE_name varchar(190) 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(190) NULL,
JOB_GROUP VARCHAR(190) 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(190) 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);

commit;

1.添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.配置Job类

package com.zhuantai.community.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @author ANTIA1
 * @date 2021/8/1 22:30
 */
public class AlphaJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(Thread.currentThread().getName() + ": execute a quartz job.");
    }
}

3.配置Config

package com.zhuantai.community.config;

import com.zhuantai.community.quartz.AlphaJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.Annotation.bean;
import org.springframework.context.Annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpletriggerFactoryBean;

/**
 * 配置 -> 数据库 -> 调用
 * @author ANTIA1
 * @date 2021/8/1 22:31
 */
@Configuration
public class QuartzConfig {

    // FactoryBean可简化Bean的实例化过程:
    // 1.通过FactoryBean封装了Bean的实例化过程
    // 2.将FactoryBean装配到Spring容器里
    // 3.将FactoryBean注入给其他的Bean
    // 4.该Bean得到的是FactoryBean所管理的对象实例.

    /**
     * 配置 JobDetail
     * @return
     */
    @Bean
    public JobDetailFactoryBean alphaJobDetail(){
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();

        factoryBean.setJobClass(AlphaJob.class);//设置任务类
        factoryBean.setName("alphaJob");//设置任务名
        factoryBean.setGroup("alphaJobGroup");//设置组名
        factoryBean.setDurability@R_489_6334@;//任务是否长久保存,不会被删除
        factoryBean.setrequestsRecovery@R_489_6334@;//任务是否可以恢复

        return factoryBean;
    }

    /**
     * 配置 trigger  (SimpletriggerFactoryBean,CrontriggerFactoryBean)
     * @param alphaJobDetail
     * @return
     */
    @Bean
    public SimpletriggerFactoryBean alphatrigger(JobDetail alphaJobDetail){

        SimpletriggerFactoryBean factoryBean = new SimpletriggerFactoryBean();

        factoryBean.setJobDetail(alphaJobDetail);//对哪个任务进行触发,根据形参名进行区分
        factoryBean.setName("alphatrigger");
        factoryBean.setGroup("alphatriggerGroup");
        factoryBean.setRepeaTinterval(3000);//执行任务的频率
        factoryBean.setJobDataMap(new JobDataMap());//存储job工作的状态

        return factoryBean;
    }
}

4.删除job

package com.zhuantai.community;

import org.junit.jupiter.api.Test;
import org.quartz.JobKey;
import org.quartz.scheduler;
import org.quartz.schedulerException;
import org.springframework.beans.factory.Annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author ANTIA1
 * @date 2021/8/1 22:55
 */
@SpringBootTest
public class QuartzTests {

    @Autowired
    private scheduler scheduler;

    @Test
    public void testdeleteJob() throws schedulerException {
        scheduler.deleteJob(new JobKey("alphaJob","alphaJobGroup"));
    }
}

5.配置文件

# QuartzProperties
spring.quartz.job-store-type=jdbc
spring.quartz.scheduler-name=communityscheduler
spring.quartz.properties.org.quartz.scheduler.instancEID=AUTO
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.thReadCount=5

通过定时任务,完成热帖排行

1.配置定时刷新任务

package com.zhuantai.community.quartz;

import com.zhuantai.community.entity.DiscussPost;
import com.zhuantai.community.service.DiscussPostservice;
import com.zhuantai.community.service.Elasticsearchservice;
import com.zhuantai.community.service.Likeservice;
import com.zhuantai.community.uitls.CommunityConstant;
import com.zhuantai.community.uitls.redisKeyUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.Annotation.Autowired;
import org.springframework.data.redis.core.boundSetOperations;
import org.springframework.data.redis.core.redisTemplate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author ANTIA1
 * @date 2021/8/1 23:23
 */
public class PostScorerefreshJob implements Job, CommunityConstant {

    //时间纪元,用于score计算
    private static final Date epoch;

    static {
        try {
            epoch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2014-08-01 00:00:00");
        } catch (ParseException E) {
            throw new RuntimeException("初始化牛客纪元失败!",E);
        }
    }

    private static final Logger LOGGER = LoggerFactory.getLogger(PostScorerefreshJob.class);

    @Autowired
    redisTemplate redisTemplate;

    @Autowired
    DiscussPostservice discussPostservice;

    @Autowired
    Likeservice likeservice;

    @Autowired
    Elasticsearchservice elasticsearchservice;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String redisKey = redisKeyUtil.getPostScoreKey();
        BoundSetOperations operations = redisTemplate.boundSetOps(redisKey);//集合

        if (operations.size() == 0){
            LOGGER.info("[任务取消] 没有要刷新的帖子!");
            return;
        }
        LOGGER.info("[任务开始] 正在刷新帖子分数 " +operations.size());
        while (operations.size()>0){
            this.refresh((Integer)operations.pop());
        }
        LOGGER.info("[任务结束] 帖子分数刷新完毕!");
    }

    private void refresh(Integer postId){
        DiscussPost post = discussPostservice.findDiscussPostById(postId);

        if (post == null){
            LOGGER.error("该帖子不存在: id=" + postId);
            return;
        }

        //是否加精
        Boolean wonderful = post.getStatus() == 1;
        //评论数量
        int commentCount = post.getCommentCount();
        //点赞数量
        long likeCount = likeservice.findEntityLikeCount(ENTITY_TYPE_POST,post.getId());

        //计算权重
        double w = (wonderful ? 75 : 0) + commentCount * 10 + likeCount * 2;

        //分数 = 权重 + 距离天数
        double score = Math.log10(Math.max(w,1))
                       +
                      (post.getCreateTime().getTime() - epoch.getTime()) / (1000 * 3600 * 24);

        //更新帖子的分数
        discussPostservice.updateScore(post.getId(),score);

        //更新分数
        post.setScore(score);
        //同步搜索数据
        elasticsearchservice.saveDiscussPost(post);

    }
}
package com.zhuantai.community.config;

import com.zhuantai.community.quartz.PostScorerefreshJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.Annotation.bean;
import org.springframework.context.Annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpletriggerFactoryBean;

/**
 * 配置 -> 数据库 -> 调用
 * @author ANTIA1
 * @date 2021/8/1 22:31
 */
@Configuration
public class QuartzConfig {

    // FactoryBean可简化Bean的实例化过程:
    // 1.通过FactoryBean封装了Bean的实例化过程
    // 2.将FactoryBean装配到Spring容器里
    // 3.将FactoryBean注入给其他的Bean
    // 4.该Bean得到的是FactoryBean所管理的对象实例.

    /**
     * 配置 JobDetail
     * @return
     */
    @Bean
    public JobDetailFactoryBean postScorerefreshJobDetail(){
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();

        factoryBean.setJobClass(PostScorerefreshJob.class);//设置任务类
        factoryBean.setName("postScorerefreshJob");//设置任务名
        factoryBean.setGroup("CommunityJobGroup");//设置组名
        factoryBean.setDurability@R_489_6334@;//任务是否长久保存,不会被删除
        factoryBean.setrequestsRecovery@R_489_6334@;//任务是否可以恢复

        return factoryBean;
    }

    /**
     * 配置 trigger  (SimpletriggerFactoryBean,CrontriggerFactoryBean)
     * @return
     */
    @Bean
    public SimpletriggerFactoryBean alphatrigger(JobDetail postScorerefreshJobDetail){

        SimpletriggerFactoryBean factoryBean = new SimpletriggerFactoryBean();

        factoryBean.setJobDetail(postScorerefreshJobDetail);//对哪个任务进行触发,根据形参名进行区分
        factoryBean.setName("postScorerefreshtrigger");
        factoryBean.setGroup("CommunitytriggerGroup");
        factoryBean.setRepeaTinterval(1000 * 60 * 5);//执行任务的频率 -> 5分钟
        factoryBean.setJobDataMap(new JobDataMap());//存储job工作的状态

        return factoryBean;
    }
}

大佬总结

以上是大佬教程为你收集整理的Quartz分布式定时任务执行和调度全部内容,希望文章能够帮你解决Quartz分布式定时任务执行和调度所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。