zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Android软件开发之SharedPreferences
    android软件开发之获取本地音乐属性
    项目开发日记
    MVC中C给V传值
    wtf忘了已经安装了Newtonsoft.json
    我的一些容易忘记的解决问题的方法
    ajax请求返回null
    验证码的一些细节
    项目做不下去
    关于HttpContex
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/7851543.html
Copyright © 2011-2022 走看看