分布式定时任务调度框架实践( 三 )

(3)代码中通过@Reference注入facade接口即可 。
@Reference(check = false,version = "demo",group="demo-service")private OfflineTaskExecutorFacade offlineTaskExecutorFacade;(4)启动程序加入@EnableDubboConfiguration注解 。
@SpringBootApplication@EnableDubboConfigurationpublic class XxlJobExecutorApplication {public static void main(String[] args) {SpringApplication.run(XxlJobExecutorApplication.class, args);}}2.4.4 任务可视化配置内置了平台项目,方便了开发者对任务的管理和执行日志的监控,并提供了一些便于测试的功能 。

分布式定时任务调度框架实践

文章插图
 
 
2.4.5 扩展(1)任务监控和报表的优化 。
(2)任务报警方式的扩展,比如加入告警中心,提供内部消息,短信告警 。
(3)对实际业务内部执行出现异常情况下的不同监控告警和重试策略 。
2.5 高可用 Elastic-Job2.5.1 基本介绍Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务 。
Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务 。
可惜的是已经两年没有迭代更新记录 。
2.5.2 原理解析 
分布式定时任务调度框架实践

文章插图
 2.5.3 实践说明2.5.3.1 demo使用
(1)安装zookeeper,配置注册中心config,配置文件加入注册中心zk的配置 。
@Configuration@ConditionalOnExpression("'${regCenter.serverList}'.length() > 0")public class JobRegistryCenterConfig {@Bean(initMethod = "init")public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList,@Value("${regCenter.namespace}") final String namespace) {return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));}}??
spring.application.name=demo_elasticjobregCenter.serverList=localhost:2181regCenter.namespace=demo_elasticjobspring.datasource.url=jdbc:MySQL://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8spring.datasource.username=userspring.datasource.password=pwd(2)配置数据源config,并配置文件中加入数据源配置 。
@Getter@Setter@NoArgsConstructor@AllArgsConstructor@ToString@Configuration@ConfigurationProperties(prefix = "spring.datasource")public class DataSourceProperties {private String url;private String username;private String password;@Bean@Primarypublic DataSource getDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}}???????
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8spring.datasource.username=userspring.datasource.password=pwd(3)配置事件config 。???????
@Configurationpublic class JobEventConfig {@Autowiredprivate DataSource dataSource;@Beanpublic JobEventConfiguration jobEventConfiguration() {return new JobEventRdbConfiguration(dataSource);}}(4)为了便于灵活配置不同的任务触发事件,加入ElasticSimpleJob注解 。???????
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface ElasticSimpleJob {@AliasFor("cron")String value() default "";@AliasFor("value")String cron() default "";String jobName() default "";int shardingTotalCount() default 1;String shardingItemParameters() default "";String jobParameter() default "";}(5)对配置进行初始化 。???????
@Configuration@ConditionalOnExpression("'${elaticjob.zookeeper.server-lists}'.length() > 0")public class ElasticJobAutoConfiguration {@Value("${regCenter.serverList}")private String serverList;@Value("${regCenter.namespace}")private String namespace;@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate DataSource dataSource;@PostConstructpublic void initElasticJob() {ZookeeperRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));regCenter.init();Map<String, SimpleJob> map = applicationContext.getBeansOfType(SimpleJob.class);for (Map.Entry<String, SimpleJob> entry : map.entrySet()) {SimpleJob simpleJob = entry.getValue();ElasticSimpleJob elasticSimpleJobAnnotation = simpleJob.getClass().getAnnotation(ElasticSimpleJob.class);String cron = StringUtils.defaultIfBlank(elasticSimpleJobAnnotation.cron(), elasticSimpleJobAnnotation.value());SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(simpleJob.getClass().getName(), cron, elasticSimpleJobAnnotation.shardingTotalCount()).shardingItemParameters(elasticSimpleJobAnnotation.shardingItemParameters()).build(), simpleJob.getClass().getCanonicalName());LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build();JobEventRdbConfiguration jobEventRdbConfiguration = new JobEventRdbConfiguration(dataSource);SpringJobScheduler jobScheduler = new SpringJobScheduler(simpleJob, regCenter, liteJobConfiguration, jobEventRdbConfiguration);jobScheduler.init();}}}


推荐阅读