分布式任务调度快速入门

分布式调度
任务调度的实现:触发器+线程池=任务调度
实现的思想:
1.调度线程:有个后台守护线程不停的轮训--触发器
2.若触发器到达临界值,则根据触发器对应出它的job,去线程池里取一个线程来执行job
3.如果线程池全忙,则阻塞等待线程
解决方案:
1.在分布式环境里,只部署一台job
2.使用分布式调度架构:
Elastic-Job(当当网) ,官网:http://elasticjob.io/docs/elastic-job-lite/00-overview/
xxl-job,官网:http://www.xuxueli.com/xxl-job/#/

实战:
1.非分布式环境调度的实现 quartz
依赖:
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
详见com.suns.job.quartz
2.非分布式环境调度的实现 spring-boot-starter-quartz + quartz (只做demo演示,线上不会使用这种方式)
依赖:
<!-- 1.非分布式环境调度的实现 quartz -->
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 2.非分布式环境调度的实现 spring-boot-starter-quartz + quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
详见com.suns.job.quartz.springboot
3.非分布式环境调度的注解方式实现 spring-boot-starter-quartz
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
增加注解: 1.启用注解 @EnableScheduling() 2.在方法上增加@Scheduled(...)
详见com.suns.job.annotation.springboot
4.分布式调度Elastic-job (参考https://github.com/yinjihuan/elastic-job-spring-boot-starter)
1.依赖:
第一步添加仓库地址:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
第二步添加依赖:
<dependency>
<groupId>com.github.yinjihuan</groupId>
<artifactId>elastic-job-spring-boot-starter</artifactId>
<version>1.0.4</version>
</dependency>
2.在application.properties中增加如下配置:
###################################################ElasticJob 配置 start###################################################
# zk注册中心
elastic.job.zk.serverLists=127.0.0.1:2181
elastic.job.zk.namespace=enjoy_job
#elastic.job.eJob1与 @ElasticJobConf(name = "eJob1") 对应
elastic.job.eJob1.cron=0/10 * * * * ?
# 分片为2来跑
elastic.job.eJob1.shardingTotalCount=2
elastic.job.eJob1.shardingItemParameters=0=beijing,1=shanghai
#elastic.job.EnjoyJob.listener=cn.enjoy.jobs.elasticjob.utils.MessageElasticJobListener
#elastic.job.EnjoyJob.jobExceptionHandler=cn.enjoy.jobs.elasticjob.utils.CustomJobExceptionHandler
###################################################ElasticJob 配置 end###################################################
3.elastic-job依赖zookeeper,需要启动zookeeper
4.详见com.suns.job.elasticjob
其中ElasticJobApp1启动端口,要与ElasticJobApp2启动端口不一样,修改配置文件中server.port=8081的值

5.分布式调度xxl-job
1.下载源码:https://github.com/xuxueli/xxl-job
2.初始化数据库脚本,脚本在源码中
如xxl-job\doc\db\tables_xxl_job.sql ,有可能建表语句会包索引太长,根据情况修改字段长度
3.修改xxl-job-admin的配置
/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties(主要是连接数据库的配置)
4.编译并打包xxl-job-admin
5.运行xxl-job-admin
入口:http://127.0.0.1:8080/xxl-job-admin (页面出来说明成功,账号密码默认admin/123456)

6.与项目整合
1.增加依赖
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
2.编写自己的业务实现MyGuleJobHandler,需要增加@JobHandler注解
@JobHandler(value = "myGuleJobHandler")//注解value值对应的是调度中心新建任务的JobHandler属性的值
@Component
public class MyGuleJobHandler extends IJobHandler
3.启动XxlJonApp1
4.配置执行器:在http://127.0.0.1:8080/xxl-job-admin的[执行器管理]中新增名为xxl-mk的执行器
刷新几次执行器管理页面,就可以看到调用的ip
5.配置任务:在http://127.0.0.1:8080/xxl-job-admin的[任务管理]中新增任务(JobHandler与@JobHandler注解中的value要一样)

示例二:普通任务,调用业务服务器
配置任务:在http://127.0.0.1:8080/xxl-job-admin的[任务管理]中新增任务(JobHandler与@JobHandler注解中的value要一样)
代码:MySimpleJob, 这个只是利用调度器 调用业务。与MyGuleJobHandler一样,比较简单
示例三:分片任务
配置任务:在http://127.0.0.1:8080/xxl-job-admin的[任务管理]中新增任务(JobHandler与@JobHandler注解中的value要一样)
注意:新增任务时[路由策略]要选为[分片广播]
代码:MyShardingJob
1.启动XxlJobApp1:修改配置文件application.properties中参数server.port=8081 xxl.job.executor.port=9991
2.启动XxlJobApp2:修改配置文件application.properties中参数server.port=8082 xxl.job.executor.port=9992
3.启动XxlJobApp3:修改配置文件application.properties中参数server.port=8083 xxl.job.executor.port=9993
示例四:在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程 (业务服务器是没有具体实现的,通过在线新增代码,来运行)
配置任务:在http://127.0.0.1:8080/xxl-job-admin的[任务管理]中新增任务
1.新增任务时[运行模式]要选为[GLUE(Java)],设置其他参数保存
2.在[操作]中点击[GLUE]按钮,跳转到在线编辑代码页面,新增如下代码
package com.xxl.job.service.handler;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import com.suns.job.service.BusinessService;

@Component
public class DemoGlueJobHandler extends IJobHandler {


@Autowired
private BusinessService businessService;

@Override
public ReturnT<String> execute(String s) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
System.out.println("动态植入代码啦:"+s);
businessService.process(0,1,s);//调用业务服务
return ReturnT.SUCCESS;
}

}
3.注意:如果注入了业务代码(BusinessService),一定要导包,否则会报错,注解@Component 或 @Autowired 的包也需要导入

posted on 2019-01-24 18:03  sgyi06  阅读(477)  评论(0编辑  收藏  举报

导航