Quartz定时器使用示例

Quartz原理以及深入理解可以参考:http://blog.itpub.net/11627468/cid-177622-list-1/

使用Quartz来实现定时加载配置进行站点状态检测

项目路径


biz.properties

alarm.cron=0 * 0/1 * * ?

SchedulerService.java

import org.quartz.Job;
import org.quartz.SchedulerException;

import java.util.Date;

public interface SchedulerService {
    void addJob(Class<? extends Job> job, String jobName, String cronExpression);

    void modifyScheduler(String jobName, String cronExpression) throws SchedulerException;

    void pauseScheduler(String jobName) throws SchedulerException;

    void resumeScheduler(String jobName) throws SchedulerException;

    void removeScheduler(String jobName);

    Date getNextFireTime(String jobName) throws SchedulerException;
}

SchedulerServiceImpl.java

import com.ymatou.envmanagement.service.SchedulerService;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;


/**
 * 
 * @author qianmin 2016年8月18日 下午3:04:02
 *
 */
@Service
public class SchedulerServiceImpl implements SchedulerService {

    private static final Logger logger = LoggerFactory.getLogger(SchedulerServiceImpl.class);

    @Autowired
    private Scheduler scheduler;

    @Override
    @Transactional(value = "mySqlTransactionManager")
    public void addJob(Class<? extends Job> job, String jobName, String cronExpression){
        try {
            List<? extends Trigger> triggerList = scheduler.getTriggersOfJob(new JobKey(jobName));
            if (triggerList == null || triggerList.isEmpty()) {
                JobDetail jobDetail = JobBuilder.newJob(job)
                        .withIdentity(jobName)
                        // .storeDurably(false) //Job是非持久性的,若没有活动的Trigger与之相关联,该Job会从Scheduler中删除掉
                        // .requestRecovery(true)
                        // //Scheduler非正常停止(进程停止或机器关闭等)时,Scheduler再次启动时,该Job会重新执行一次
                        .build();
                Trigger trigger = TriggerBuilder.newTrigger()
                        .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)
                                .withMisfireHandlingInstructionDoNothing())
                        .build();
                scheduler.scheduleJob(jobDetail, trigger);
            }
            else {
                modifyScheduler(jobName, cronExpression);
            }
        } catch (SchedulerException e) {
            logger.warn("add job warm some other has done", e);
        }
    }

    @Override
    @SuppressWarnings({"rawtypes", "unchecked"})
    public void modifyScheduler(String jobName, String cronExpression) throws SchedulerException {
        // 获取job的原trigger
        List<? extends Trigger> triggerList = scheduler.getTriggersOfJob(new JobKey(jobName));
        Trigger oldTrigger = triggerList.get(0); // job与trigger一一对应, job有且只有一个trigger

        String oldExpr = ((CronTrigger)oldTrigger).getCronExpression();
        if(!cronExpression.equals(oldExpr)){

            // 借助于原trigger相关联的triggerBuilder修改trigger
            TriggerBuilder tb = oldTrigger.getTriggerBuilder();

            Trigger newTrigger = tb.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();

            scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger);
        }
    }

    @Override
    public void pauseScheduler(String jobName) throws SchedulerException {
        scheduler.pauseJob(new JobKey(jobName));
    }

    @Override
    public void resumeScheduler(String jobName) throws SchedulerException {
        scheduler.resumeJob(new JobKey(jobName));
    }

    @Override
    @Transactional(value = "mySqlTransactionManager")
    public void removeScheduler(String jobName){
        JobKey jobKey = new JobKey(jobName);
        try {
            if(scheduler.checkExists(jobKey)){
                scheduler.deleteJob(jobKey);
            }
        } catch (SchedulerException e) {
            logger.warn("removeScheduler warm some other has done", e);
        }

    }

    @Override
    public Date getNextFireTime(String jobName) throws SchedulerException {
        List<? extends Trigger> triggerList = scheduler.getTriggersOfJob(new JobKey(jobName));
        Trigger oldTrigger = triggerList.get(0);
        return oldTrigger.getNextFireTime();
    }
}

RuleDiscoverer

import com.alibaba.fastjson.JSON;

import com.ymatou.envmanagement.config.BizConfig;
import com.ymatou.envmanagement.domain.service.impl.WebMonitorServiceImpl;
import com.ymatou.envmanagement.holder.RuleHolder;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.NodePo;
import com.ymatou.envmanagement.service.SchedulerService;
import com.ymatou.envmanagement.support.ScheduledExecutorHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


@Component
public class RuleDiscoverer {

    private static final Logger logger = LoggerFactory.getLogger(RuleDiscoverer.class);

    @Autowired
    private SchedulerService schedulerService;

    @Autowired
    private WebMonitorServiceImpl webMonitorService;

    @Autowired
    private BizConfig bizConfig;

    private ScheduledExecutorService scheduledExecutorService = ScheduledExecutorHelper.newSingleThreadScheduledExecutor("rule discover");

    @PostConstruct
    public void execute() {

        scheduledExecutorService.scheduleAtFixedRate(() -> {
            try {
                reload();
            } catch (Exception ex) {
                logger.error("reload rule error", ex);
            }

        },0L, 1L, TimeUnit.H );

    }

    /**
     * 加载警报配置
     */
    @Transactional
    public void reload() {

        List<NodePo> nodes=webMonitorService.selectActive();
        HashMap<String, NodePo> rules = new HashMap<>();

        for (NodePo node : nodes) {
            rules.put(node.getDomain(), node);

            schedulerService.addJob(AlarmRuleJob.class, node.getDomain(), node.getCron());
        }

        // 已删除的规则 定时任务
            RuleHolder.alarmConfigRule.keySet().stream()
                .filter(ruleName -> rules.values().stream().noneMatch(rule -> rule.getDomain().equals(ruleName)))
                .forEach(ruleName -> schedulerService.removeScheduler(ruleName));

        // 替换
        RuleHolder.alarmConfigRule = rules;
        logger.info("load rule data: {}", JSON.toJSONString(rules));
    }

    @PreDestroy
    public void destroy() {
        scheduledExecutorService.shutdownNow();
    }
}

AlarmRuleJob

import com.ymatou.envmanagement.infrastructure.util.SpringContextHolder;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author qianmin 2016年9月12日 上午11:05:19
 * 
 */
@DisallowConcurrentExecution
public class AlarmRuleJob implements Job {

    private static final Logger logger = LoggerFactory.getLogger(AlarmRuleJob.class);

    @Override
    public void execute(JobExecutionContext context) {
        try {
            SpringContextHolder.getBean(AlarmRuleExecutor.class).execute(context);
        } catch (Exception e) {
            logger.error("error exec AlarmRuleJob :{}",
                    context.getJobDetail().getKey().getName(), e);
        }
    }
}

AlarmRuleExecutor

import com.google.common.collect.Lists;
import com.ymatou.envmanagement.config.BizConfig;
import com.ymatou.envmanagement.domain.service.impl.WebMonitorServiceImpl;
import com.ymatou.envmanagement.infrastructure.mysqldb.model.NodePo;
import com.ymatou.envmanagement.service.NotifyService;
import org.apache.commons.lang3.StringUtils;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import  com.ymatou.envmanagement.constants.Constants;

/**
 * FIXME:check biz rule
 * @author qianmin 2016年9月12日 上午11:05:19
 * 
 */
@Component
public class AlarmRuleExecutor{

    private static final Logger logger = LoggerFactory.getLogger(AlarmRuleExecutor.class);
    private static final DateTimeFormatter FORMATTER_YMDHMS =DateTimeFormatter.ofPattern("yyyyMMddHHmmss") ;

    @Autowired
    private WebMonitorServiceImpl webMonitorService;

    @Autowired
    private BizConfig bizConfig;

    @Autowired
    private NotifyService notifyService;

    public void execute(JobExecutionContext context) {
        try {
        logger.info("exec alarm start. {}", LocalDateTime.now().format(FORMATTER_YMDHMS));
        String jobName = context.getJobDetail().getKey().getName();

        List<NodePo> nodes = webMonitorService.selectNodeByDomain(jobName);

        if (nodes.size()==0) {
            logger.info("exec alarm job: {} node==null", jobName);
            return;
        }


            this.execAlarm(nodes.get(0));

        logger.info("exec alarm end. {}", LocalDateTime.now().format(FORMATTER_YMDHMS));

        } catch (Exception e) {

            logger.info("exec alarm excaption. {}"+e.getMessage(), LocalDateTime.now().format(FORMATTER_YMDHMS));
            e.printStackTrace();
        }
    }

    /**
     * 发送警报
     */
    private void execAlarm(NodePo node) throws Exception {
        if (node == null) {
            return;
        }

        String port = bizConfig.getClientPort();

        if(node.getStressemailactive()!=null && node.getStressemailactive())
        {
            String stressIp = bizConfig.getStressIp();
            String stressUrl="http://"+stressIp+":"+port+"/domain/getwarmup";
            if(!webMonitorService.viewState(node,"STRESS",stressUrl,3))
            {
                notifyService.sendEmail(node.getDomain(),node.getUrl(),"STRESS",node.getEmails(),LocalDateTime.now());
            }
        }

        if(node.getSitemailactive()!=null && node.getSitemailactive())
        {
            String sitIp = bizConfig.getSitIp();
            String sitUrl="http://"+sitIp+":"+port+"/domain/getwarmup";
           if(! webMonitorService.viewState(node,"SIT1",sitUrl,3))
           {
               notifyService.sendEmail(node.getDomain(),node.getUrl(),"SIT",node.getEmails(),LocalDateTime.now());
           }
        }

        if(node.getUatemailactive()!=null && node.getUatemailactive())
        {
            String uatIp = bizConfig.getUatIp();
            String uatUrl="http://"+uatIp+":"+port+"/domain/getwarmup";
            if(webMonitorService.viewState(node,"UAT",uatUrl,3))
            {
                notifyService.sendEmail(node.getDomain(),node.getUrl(),"UAT",node.getEmails(),LocalDateTime.now());
            }
        }

    }

    private long getThreshold(Integer threshold, long defaultValue) {
        if (threshold == null) {
            return defaultValue;
        }
        return threshold.longValue();
    }


    /**
     * 用分隔符拼接list
     * @param address
     * @param delimiter
     * @return
     */
    private String getAddress(List<String> address, String delimiter) {
        return address.stream().filter(StringUtils::isNotBlank).distinct().collect(Collectors.joining(delimiter));
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是一个开源的任务调度框架,可以用来实现定时任务、调度任务等功能。下面是使用Quartz定时器的步骤: 1. 导入Quartz依赖包:在项目的pom.xml文件中添加Quartz的依赖包。 2. 创建Job类:创建一个实现了org.quartz.Job接口的类,该类中实现需要定时执行的任务逻辑。 3. 创建Trigger:创建一个org.quartz.Trigger对象,用于指定定时任务的触发条件,如触发时间、重复次数等。 4. 创建Scheduler:创建一个org.quartz.Scheduler对象,用于管理定时任务的调度。 5. 将Job和Trigger添加到Scheduler中:将Job和Trigger添加到Scheduler中,使其开始执行定时任务。 下面是一个使用Quartz定时器示例代码: ```java import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzTest { public static void main(String[] args) throws SchedulerException { // 创建一个JobDetail对象,指定定时执行的任务逻辑 JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build(); // 创建一个Trigger对象,指定定时执行的时间和重复次数 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()) .build(); // 创建一个Scheduler对象,用于管理定时任务的调度 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 将Job和Trigger添加到Scheduler中,使其开始执行定时任务 scheduler.scheduleJob(jobDetail, trigger); // 启动Scheduler scheduler.start(); } } class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { // 定时执行的任务逻辑 System.out.println("Hello Quartz!"); } } ``` 上述代码中,创建了一个JobDetail对象和一个Trigger对象,并将它们添加到Scheduler中,使其每隔10秒执行一次定时任务。执行的任务逻辑在MyJob类中实现,简单输出了一句话。运行程序后,控制台会不断输出“Hello Quartz!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值