为什么80%的码农都做不了架构师?>>>
一,我们需要自定义个注解
@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);
}
}
}