elastic job 动态设置定时任务

1. 版本

    <!-- import elastic-job lite core -->
    <dependency>
      <groupId>com.dangdang</groupId>
      <artifactId>elastic-job-lite-core</artifactId>
      <version>2.1.3</version>
    </dependency>

    <!-- import other module if need -->
    <dependency>
      <groupId>com.dangdang</groupId>
      <artifactId>elastic-job-lite-spring</artifactId>
      <version>2.1.3</version>
    </dependency>

2. 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
       xmlns:job="http://www.dangdang.com/schema/ddframe/job"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.dangdang.com/schema/ddframe/reg
                        http://www.dangdang.com/schema/ddframe/reg/reg.xsd
                        http://www.dangdang.com/schema/ddframe/job
                        http://www.dangdang.com/schema/ddframe/job/job.xsd
                        ">
    <!--configure registry center -->
    <reg:zookeeper id="regCenter" server-lists="${job.registry.address}" namespace="${job.namespace}" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />

    <!--configure job -->
    <!--<job:simple id="myElasticJob" class="com.zhuanche.util.MyElasticJob" registry-center-ref="regCenter" cron="0/10 * * * * ?"   sharding-total-count="1" sharding-item-parameters="0=A" />-->
</beans>

3.1 代码

import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;        

  String cron = DateUtil.getCron(activityEndTime);
            logger.info("【定时任务执行的时间】cron={}",cron);
            int shardingTotalCount = 1;
            String jobName = UUID.randomUUID().toString() + "-" + numprizeBaseId;
            JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobName, cron, shardingTotalCount).build();
            SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, DynamicElasticJob.class.getCanonicalName());
            JobScheduler jobScheduler = new JobScheduler(zookeeperRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).build());
            try {
                jobScheduler.init();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("定时任务创建失败");
            }

3.2 工具类

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by admin on 2017/10/23.
 */
public class DateUtil {
    private static final String CRON_DATE_FORMAT = "ss mm HH dd MM ? yyyy";

    /***
     * @param date 时间
     * @return cron类型的日期
     */
    public static String getCron(final Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(CRON_DATE_FORMAT);
        String formatTimeStr = "";
        if (date != null) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }
}

 3.3 动态定时任务代码

说明 :其中可能用到service及dao包中的类,那么需要实力化,是通过spring的注解@Autowired来吗(+ @Compenent + <context:component-scan/>)

不行!!!!

理解:

spring管理的bean,例如通过<bean>节点纳入生命周期管理,或者在application-context.xm中<context:component-scan/>扫描包 ,并

在类中标记该类要扫描@Compenent,xxService要注入@Autowired,便可用了

但是有些bean可能不是从spring容器中拿的bean,而是自己new的,如这个动态创建的ddframe.job,那么execute时

其中的属性就没有完全初始化。就回 空指针

解决方案

package com.sq.integral.core.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.fasterxml.jackson.core.type.TypeReference;
import com.sq.integral.common.cache.CacheManager;
import com.sq.integral.core.pojo.NumPrizeBaseVO;
import com.sq.integral.core.service.NumPrizeService;
import com.sq.integral.core.service.impl.NumPrizeServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: rocky
 * @Date: Created in 2018/6/11.
 */
@Component
public class DynamicElasticJob implements SimpleJob {

    private static final Logger logger = LoggerFactory.getLogger(DynamicElasticJob.class);
    private static final String NUM_PRIZE = "xxxx";
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    @Autowired
    private NumPrizeService numPrizeService;
    private static DynamicElasticJob dynamicElasticJob;
    @PostConstruct
    public void init(){
        dynamicElasticJob = this;
        dynamicElasticJob.numPrizeService = this.numPrizeService;
    }
    @Override
    public void execute(ShardingContext shardingContext) {

        try {
            String dateStr = getSendAwardDate(shardingContext.getJobName());
            //从redis获取活动数据
            List<NumPrizeBaseVO> numPrizeBaseVOS = CacheManager.get(NUM_PRIZE, new TypeReference<List<NumPrizeBaseVO>>() {});
            //赛选符合要求活动集合
            List<NumPrizeBaseVO> collect  = numPrizeBaseVOS.stream().filter(base -> judgeDateCondition(base, dateStr)).collect(Collectors.toList());
            logger.info("按日期补发数单奖, date={}, 符合要求活动={}", dateStr, collect);
            //处理发奖
            dynamicElasticJob.numPrizeService.numPrizeSendAward(collect, 0);
        } catch (Exception e) {
            logger.error("按日期补发数单奖出错"+e);
        }
    }

    private boolean judgeDateCondition(NumPrizeBaseVO base, String dateStr) {
        return dateStr.contains(sdf.format(base.getActivityEndTime()));
    }

    private String getSendAwardDate(String jobName) {
        String[] strs = jobName.split("_");
        return  strs[strs.length - 1];
    }
}
View Code
原文地址:https://www.cnblogs.com/rocky-fang/p/7851543.html