ElasticJob自定义注解注册任务

为什么80%的码农都做不了架构师?>>>   hot3.png

一,我们需要自定义个注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ElasticSimpleJob {

    @AliasFor("cron")
    public abstract String value() default "";

    @AliasFor("value")
    public abstract String cron() default "";

    public abstract String jobName() default "";

    public abstract int shardingTotalCount() default 1;

    public abstract String shardingItemParameters() default "";

    public abstract String jobParameter() default "";

    public abstract String dataSource() default "";

    public abstract String description() default "";

    public abstract boolean disabled() default false;

    public abstract boolean overwrite() default false;

    public abstract boolean failover() default true;

    public abstract boolean monitorExecution() default true;
}

二、实例化注册中心 (注意我这里取值是接入了apollo配置中心)

@Configuration
@ConditionalOnExpression("'${elaticjob.zookeeper.server.lists}'.length() > 0")
public class JobConfig {

    /**
     * 满足@ConditionalOnExpression才会实例化Bean
     *
     * @param serverList
     * @param namespace
     * @return ZookeeperRegistryCenter
     */
    @Bean(initMethod = "init")
    public ZookeeperRegistryCenter regCenter(@Value("${elaticjob.zookeeper.server.lists}") final String serverList,
                                             @Value("${elaticjob.zookeeper.namespace}") final String namespace) {
        return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
    }
}

三、支持动态添加job任务配置

@Configuration
public class SimpleJobConfig {

    @Resource
    private ZookeeperRegistryCenter regCenter;

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    public void initElasticJob() {

        Map map = applicationContext.getBeansOfType(SimpleJob.class);

        for (Map.Entry entry : map.entrySet()) {
            SimpleJob simpleJob = entry.getValue();
            if (AopUtils.isAopProxy(simpleJob)) {
                try {
                    simpleJob = (SimpleJob) ((Advised) simpleJob).getTargetSource().getTarget();
                } catch (Exception e) {
                    throw new RuntimeException("==>代理类转换异常!", e);
                }
            }

            ElasticSimpleJob elasticSimpleJobAnnotation = simpleJob.getClass().getAnnotation(ElasticSimpleJob.class);

            if (null != elasticSimpleJobAnnotation) {
                String cron = StringUtils.defaultIfBlank(elasticSimpleJobAnnotation.cron(),
                        elasticSimpleJobAnnotation.value());
                String jobName = StringUtils.isBlank(elasticSimpleJobAnnotation.jobName()) ? simpleJob
                        .getClass().getName() : elasticSimpleJobAnnotation.jobName();
                boolean overwrite = elasticSimpleJobAnnotation.overwrite() ? true : false;
                boolean monitorExecution = elasticSimpleJobAnnotation.monitorExecution() ? true : false;

                //SimpleJob任务配置
                SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(
                        JobCoreConfiguration
                                .newBuilder(jobName, cron, elasticSimpleJobAnnotation.shardingTotalCount())
                                .shardingItemParameters(elasticSimpleJobAnnotation.shardingItemParameters())
                                .description(elasticSimpleJobAnnotation.description())
                                .failover(elasticSimpleJobAnnotation.failover())
                                .jobParameter(elasticSimpleJobAnnotation.jobParameter()).build(), simpleJob
                        .getClass().getCanonicalName());
                LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration
                        .newBuilder(simpleJobConfiguration).overwrite(overwrite)
                        .monitorExecution(monitorExecution).build();

//                //配置数据源
//                String dataSourceRef = elasticSimpleJobAnnotation.dataSource();
//                if (StringUtils.isNotBlank(dataSourceRef)) {
//
//                    if (!applicationContext.containsBean(dataSourceRef)) {
//                        throw new RuntimeException("not exist datasource [" + dataSourceRef + "] !");
//                    }
//
//                    DataSource dataSource = (DataSource) applicationContext.getBean(dataSourceRef);
//                    JobEventRdbConfiguration jobEventRdbConfiguration = new JobEventRdbConfiguration(
//                        dataSource);
//                    SpringJobScheduler jobScheduler = new SpringJobScheduler(simpleJob, regCenter,
//                        liteJobConfiguration, jobEventRdbConfiguration);
//                    jobScheduler.init();
//                }

                SpringJobScheduler jobScheduler = new SpringJobScheduler(simpleJob, regCenter,
                        liteJobConfiguration);
                jobScheduler.init();

            }
        }
    }
}

四、自定义自己任务类,注解接入esjob  (这里需要注意的是 job类是否被代理过)

@Component
@ElasticSimpleJob(jobName = "closePayOrderJob", cron = "0 0/2 * * * ?", description = "超时关闭支付单")
public class ClosePayOrderJob implements SimpleJob {

    @Resource
    private XxxRpc xxxRpc;

    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("==>任务总片数:{},当前分片项:{},当前分片参数:{},当前任务参数:{}",
                shardingContext.getShardingTotalCount(),
                shardingContext.getShardingItem(),
                shardingContext.getShardingParameter(),
                shardingContext.getJobName(),
                shardingContext.getJobParameter());
        try {
            xxxRpc.excuteClosePayOrder();
        } catch (Exception e) {
           log.error("==>关单任务发生异常!",e);
        }
    }
}

 

转载于:https://my.oschina.net/dyyweb/blog/2987829

你可能感兴趣的:(ElasticJob自定义注解注册任务)