quartz通过数据库配置trigger

来源:互联网 发布:罗志祥女友的淘宝店名 编辑:程序博客网 时间:2024/06/01 10:01

通过数据库和配置中心superdimond动态的修改trigger,也可以逻辑删除job。

Spring配置文件如下:

<bean id="" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"  p:targetObject-ref="" p:targetMethod="" p:concurrent="true" />
或者

<bean id="priceTaskDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="masterMsgsProceedManage" /><property name="targetMethod" value="processMqSkuPriceMsg" /></bean>

只配置jobDetail,trigger信息通过数据库获得,或通过配置中心。

import com.github.diamond.client.PropertiesConfiguration;import com.github.diamond.client.PropertiesConfigurationFactoryBean;import org.quartz.*;import org.quartz.impl.JobDetailImpl;import org.quartz.impl.triggers.SimpleTriggerImpl;import org.springframework.beans.factory.NoSuchBeanDefinitionException;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import org.springframework.stereotype.Service;import java.util.*;@Servicepublic class SchedulerConfigFactory extends SchedulerFactoryBean{    protected static PropertiesConfiguration config = PropertiesConfigurationFactoryBean.getPropertiesConfiguration();    @Override    public void afterPropertiesSet() throws Exception {        initTriggers();        initQuartzProperties();        setWaitForJobsToCompleteOnShutdown(true);        super.afterPropertiesSet();    }    void initTriggers(){        Set<String> keys=config.getProperties().stringPropertyNames();        List<Trigger>  list= new ArrayList<Trigger>();        for(String keyName:keys){            if(keyName.startsWith("job_")){                SimpleTriggerImpl simpleTrigger=createSimpleTrigger(keyName,config.getLong(keyName));                if(simpleTrigger!=null){                    list.add(simpleTrigger);                }            }        }        Trigger[] triggers=new Trigger[list.size()];        setTriggers(list.toArray(triggers));    }    void initQuartzProperties(){        Properties quartzProperties = new Properties();        quartzProperties.setProperty("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");        quartzProperties.setProperty("org.quartz.threadPool.threadCount",config.getString("org.quartz.threadPool.threadCount"));        quartzProperties.setProperty("org.quartz.jobStore.misfireThreshold","1000");        setQuartzProperties(quartzProperties);    }    SimpleTriggerImpl createSimpleTrigger(String jobName,long repeatInterval){        try {            JobDetail jobDetail=(JobDetailImpl) SpringBeanUtil.getBean(jobName);            SimpleTriggerImpl simpleTrigger=new SimpleTriggerImpl();            simpleTrigger.setName("trigger_"+jobName);            simpleTrigger.setGroup(Scheduler.DEFAULT_GROUP);            simpleTrigger.setJobKey(jobDetail.getKey());            JobDataMap jobDataMap = new JobDataMap();            jobDataMap.put("jobDetail", jobDetail);            simpleTrigger.setJobDataMap(jobDataMap);            simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 2000));            simpleTrigger.setRepeatInterval(repeatInterval);            simpleTrigger.setRepeatCount(-1);            return simpleTrigger;        }catch (NoSuchBeanDefinitionException e){            logger.error("NoSuchBeanDefinitionException,jobBeanName:" +jobName);            return null;        }    }}

监听

import com.github.diamond.client.event.ConfigurationEvent;import com.github.diamond.client.event.ConfigurationListener;import lombok.extern.slf4j.Slf4j;import org.quartz.Scheduler;import org.quartz.TriggerKey;import org.quartz.impl.StdScheduler;import org.quartz.impl.triggers.SimpleTriggerImpl;import org.springframework.stereotype.Service;@Service@Slf4jpublic class SchedulerConfigListener implements ConfigurationListener {    @Override    public void rescheduleJob(ConfigurationEvent event) {        try {            String configKey = event.getPropertyName();                        String configValue = event.getPropertyValue().toString();            StdScheduler scheduler=SpringUtil.getBean(StdScheduler.class);            TriggerKey triggerKey = new TriggerKey(configKey,Scheduler.DEFAULT_GROUP);            SimpleTriggerImpl trigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerKey);            trigger.setRepeatInterval(Long.valueOf(configValue));            scheduler.rescheduleJob(triggerKey, trigger);        } catch (Exception e) {            log.info("监听配置修改异常:{}", e);        }    }}

数据库实现

create table `project_config` (  `config_id` int(11) not null auto_increment,  `config_key` varchar(64) not null,  `config_value` longtext not null,  `config_type` int(1) not null,  `config_desc` varchar(256) default null,  `project_id` varchar(256) default null,  `delete_flag` int(1) default '0',  `opt_user` varchar(32) default null,  `opt_time` datetime default null,  primary key (`config_id`)) engine=innodb auto_increment=11780 default charset=utf8

只支持SimpleTriggerImpl,可以添加功能支持CronTriggerImpl

官方Quartz API

原创粉丝点击