分布式调度 任务调度的实现:触发器+线程池=任务调度 实现的思想: 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 的包也需要导入
原文地址:https://www.cnblogs.com/lookupthesky/p/10316025.html
时间: 2024-11-06 03:41:26