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]; } }