zoukankan      html  css  js  c++  java
  • 分布式任务调度快速入门

    分布式调度
    任务调度的实现:触发器+线程池=任务调度
    实现的思想:
    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-jobdocdb ables_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 的包也需要导入

  • 相关阅读:
    第十二周课程总结
    十一周课程总结
    解决“service nginx does not support chkconfig”的问题?
    centos 安装机器学习包
    JavaWeb的各种中文乱码终极解决方法
    神经网络
    JavaWeb学习总结(一)——JavaWeb开发入门
    java基础学习总结——基础语法2
    java基础学习总结——基础语法1
    java基础学习总结——java环境变量配置
  • 原文地址:https://www.cnblogs.com/lookupthesky/p/10316025.html
Copyright © 2011-2022 走看看