quartz 定时任务管理

一、立即执行

Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey("job_name", JobKey.DEFAULT_GROUP);
scheduler.triggerJob(jobKey);


关于schedulerFactoryBean,可通过注解注入

@Autowired
private SchedulerFactoryBean schedulerFactoryBean;

如不行,则通过spring获取bean

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class Springfactory implements BeanFactoryAware {

    private static BeanFactory beanFactory;  

    // private static ApplicationContext context;  

    public void setBeanFactory(BeanFactory factory) throws BeansException {
        Springfactory.beanFactory = factory;
    }

    /** 
     * 根据beanName名字取得bean 
     * @param beanName 
     * @return 
     */  
    @SuppressWarnings("unchecked")
	public static <T> T getBean(String beanName) {
        if (null != beanFactory) {
            return (T) beanFactory.getBean(beanName);
        }
        return null;
    }  
} 

Scheduler scheduler = Springfactory.getBean("schedulerFactoryBean");

二、动态修改时间

因为是分布式系统,所以采用的是disconf来统一管理quartz的配置文件

如不知道disconf,可先自行百度,此处不详说

import java.util.List;
import java.util.Properties;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.stereotype.Service;

import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.update.IDisconfUpdate;

@Service
@Scope("singleton")
@DisconfUpdateService(confFileKeys = { "quartz.properties" })
public class QuartzServiceUpdateCallback implements IDisconfUpdate{

	private static final Logger logger = LoggerFactory.getLogger(QuartzServiceUpdateCallback.class);
	@Override
	public void reload() throws Exception {
		Scheduler scheduler = Springfactory.getBean("schedulerFactoryBean");

		//加载配置文件
		PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
		Resource[] resourceList = pathMatchingResourcePatternResolver.getResources(
				this.getClass().getAnnotation(DisconfUpdateService.class).confFileKeys()[0]);
		Properties props = PropertiesLoaderUtils.loadProperties(new EncodedResource(resourceList[0], "GBK"));

		for (Object key : props.keySet()) {
			String newTime = props.getProperty(key.toString());
			JobKey jobKey = new JobKey(key.toString());

			List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
			for (Trigger trigger : triggers) {
				if (trigger instanceof CronTrigger && !newTime.equalsIgnoreCase(((CronTrigger) trigger).getCronExpression())) {
					logger.info("Updating property {}.cronExpression from {} to {}", trigger.getKey().getName(),
							((CronTrigger) trigger).getCronExpression(), newTime);
					
					TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
					trigger = triggerBuilder.withIdentity(trigger.getKey().getName(), TriggerKey.DEFAULT_GROUP).withSchedule(
									CronScheduleBuilder.cronSchedule(newTime)).build();
					scheduler.rescheduleJob(trigger.getKey(), trigger);
				}
			}
		}
	}
}


disconf管理配置文件,但是回调函数并不能知道配置文件里具体是哪个属性发生变化,所以只能通过读取下载的最新的配置文件与

内存里的定时任务的时间表达式进行比较

若相同,则不管

若不同,则重新设置该任务的时间表达式,并生效


这样子就ok了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值