quatz调度-手动终止线程(1) 创建触发器,线程执行完毕后添加到cleaner list

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerBean;
import com.tdtech.eplatform.gatekeeper.listener.JobTriggerListener;

public class QuartzCenter {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private QuartzUtil quartzUtil;
    @Autowired
    private Scheduler scheduler;
    @Autowired
    private JobTriggerListener jobTriggerListener;

    public String scheduleJob(Object targetObject, String targetMethod, int repeatCount, long repeatInterval, long startDelay) {
        String jobName = quartzUtil.makeJobName(targetMethod);
        try {
            logger.info("scheduleJob jobname:"+jobName);
            if(targetMethod != null && targetMethod.startsWith("run")){                
scheduler.addTriggerListener(jobTriggerListener);
} MethodInvokingJobDetailFactoryBean jobDetailFactoryBean
= new MethodInvokingJobDetailFactoryBean(); jobDetailFactoryBean.setTargetObject(targetObject); jobDetailFactoryBean.setTargetMethod(targetMethod); jobDetailFactoryBean.setName(jobName); jobDetailFactoryBean.setConcurrent(false); jobDetailFactoryBean.afterPropertiesSet(); SimpleTriggerBean simpleTriggerBean = new SimpleTriggerBean(); simpleTriggerBean.setBeanName(quartzUtil.makeTriggerBeanName(targetMethod)); simpleTriggerBean.setRepeatCount(repeatCount); simpleTriggerBean.setRepeatInterval(repeatInterval); simpleTriggerBean.setStartDelay(startDelay); simpleTriggerBean.afterPropertiesSet(); if(targetMethod!=null && targetMethod.startsWith("run")) { simpleTriggerBean.addTriggerListener("conTriggerListener"); } scheduler.scheduleJob((JobDetail) jobDetailFactoryBean.getObject(), simpleTriggerBean); } catch (Exception e) { jobName = null; logger.error("scheduleJob failed!", e); } return jobName; } public boolean terminateJob(String jobName) { if (jobName == null) { return false; } try { return scheduler.deleteJob(jobName, null); } catch (Exception e) { logger.error("terminate job failed![jobName] is " + jobName, e); } return false; } }

JobTriggerListener 触发器

import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
public class JobTriggerListener implements TriggerListener {

    @Override
    public String getName() {
        return "conTriggerListener";
    }

    @Override
    public void triggerComplete(Trigger arg0, JobExecutionContext arg1, int arg2) {

        Date d = arg1.getNextFireTime();
        String jobName  = arg1.getJobDetail().getName();
        if (d == null && jobName!=null && jobName.startsWith("run")) {
            Cleaner.getInstance().put(arg1.getJobDetail().getName());
        }
    }

    @Override
    public void triggerFired(Trigger arg0, JobExecutionContext arg1) {
    }

    @Override
    public void triggerMisfired(Trigger arg0) {
    }

    @Override
    public boolean vetoJobExecution(Trigger arg0, JobExecutionContext arg1) {
        return false;
    }

}

//生成线程名 uuid

import com.fasterxml.uuid.Generators;
import com.fasterxml.uuid.NoArgGenerator;


public class QuartzUtil {
    /**
     * 使用UUID避免生成重复的名称
     * 影响程序性能,毕竟字符串比较非常耗时
     */
    private final NoArgGenerator uuidGenerator = Generators.randomBasedGenerator();

    public String makeJobName(String customName) {
        return customName + "_" + uuidGenerator.generate().toString();
    }

    public String makeTriggerBeanName(String customName) {
        return customName + "_" + uuidGenerator.generate().toString();
    }

}

//业务流程

    protected void disconnectChannel() {

           ...
            String jobName = quartzCenter.scheduleJob(new CheckShouldCloseChannel(userDataIndex), "run", CHECK_CHANNEL_SHOULD_CLOSE_CNT - 1, 10000L, 10000L);
           ...
    }    
原文地址:https://www.cnblogs.com/eaglediao/p/6896038.html