1. 程式人生 > >springboot 定時任務 implements Job 開發。

springboot 定時任務 implements Job 開發。

1、在 application.properties 中配置要例項化的類

#quartz
quartz.scheduler.instanceName:b2bScheduler
2、定時任務配置類


@Configuration
public class QuarzConfig {
    @Value("${quartz.scheduler.instanceName}")
    private String quartzInstanceName;

    @Value("${spring.datasource.driverClassName}")
    private 
String myDSDriver; @Value("${spring.datasource.url}") private String myDSURL; @Value("${spring.datasource.username}") private String myDSUser; @Value("${spring.datasource.password}") private String myDSPassword; private Properties quartzProperties() throws IOException { Properties prop = new
Properties(); prop.put("quartz.scheduler.instanceName", quartzInstanceName); prop.put("org.quartz.scheduler.instanceId", "AUTO"); prop.put("org.quartz.scheduler.skipUpdateCheck", "true"); prop.put("org.quartz.scheduler.jmx.export", "true"); prop.put("org.quartz.jobStore.class"
, "org.quartz.impl.jdbcjobstore.JobStoreTX"); prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); prop.put("org.quartz.jobStore.dataSource", "myDS"); prop.put("org.quartz.jobStore.tablePrefix", "qrtz_"); prop.put("org.quartz.jobStore.isClustered", "true"); prop.put("org.quartz.jobStore.clusterCheckinInterval", "20000"); prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); prop.put("org.quartz.jobStore.misfireThreshold", "120000"); prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE"); prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); prop.put("org.quartz.threadPool.threadCount", "10"); prop.put("org.quartz.threadPool.threadPriority", "5"); prop.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread", "true"); prop.put("org.quartz.dataSource.myDS.driver", myDSDriver); prop.put("org.quartz.dataSource.myDS.URL", myDSURL); prop.put("org.quartz.dataSource.myDS.user", myDSUser); prop.put("org.quartz.dataSource.myDS.password", myDSPassword); prop.put("org.quartz.plugin.triggHistory.class", "org.quartz.plugins.history.LoggingJobHistoryPlugin"); prop.put("org.quartz.plugin.shutdownhook.class", "org.quartz.plugins.management.ShutdownHookPlugin"); prop.put("org.quartz.plugin.shutdownhook.cleanShutdown", "true"); return prop; } @Bean public JobFactory jobFactory(ApplicationContext applicationContext) { AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); return jobFactory; } @Bean public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory) throws IOException { SchedulerFactoryBean bean = new SchedulerFactoryBean(); bean.setOverwriteExistingJobs(true); bean.setQuartzProperties(quartzProperties()); bean.setJobFactory(jobFactory); bean.setStartupDelay(20); return bean; } }

3、Job 工廠

public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}
4、核心Job 方法。積分清零的任務。每 5 秒執行一次。


@Component
public class ScoreJob implements Job{
    private static final Logger logger = LoggerFactory.getLogger(ScoreJob.class);

    private static final String NAME = "clean_score_job";//正式
    private static final String CRON = "0/5 * * * * ?";//正式

    @Autowired
   @Qualifier("schedulerFactoryBean")
    private Scheduler b2bScheduler;
    @PostConstruct
    public void init() {
        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
        // 構建job資訊
        JobDetail jobDetail = JobBuilder.newJob(ScoreJob.class).withIdentity(NAME, NAME).build();
        System.out.println(jobDetail.isConcurrentExectionDisallowed());
        tigger.getJobDataMap().put(NAME, NAME);
        tigger.setJobDetail(jobDetail);
        tigger.setBeanName(NAME);
        try {
            tigger.setCronExpression(CRON);
            tigger.afterPropertiesSet();
            JobKey jobKey = new JobKey(NAME, NAME);
            boolean checkExists = b2bScheduler.checkExists(jobKey);
            if (checkExists) {
                b2bScheduler.deleteJob(jobKey);
            }
            //b2bScheduler.scheduleJob(jobDetail, tigger.getObject());

        } catch (Exception e) {
            logger.error("score job error", e);
        }
    }


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //logger.info("定時任務 年底清零 開始----------");
        //logger.info("定時任務 年底清零 結束----------");

    }
}