我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot2中怎么整合ElasticJob框架

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot2中怎么整合ElasticJob框架

这篇文章将为大家详细讲解有关SpringBoot2中怎么整合ElasticJob框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、ElasticJob简介

1、定时任务

在前面的文章中,说过QuartJob这个定时任务,被广泛应用的定时任务标准。但Quartz核心点在于执行定时任务并不是在于关注的业务模式和场景,缺少高度自定义的功能。Quartz能够基于数据库实现任务的高可用,但是不具备分布式并行调度的功能。

-> QuartJob定时任务

2、ElasticJob说明

  • 基础简介

Elastic-Job 是一个开源的分布式调度中间件,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。Elastic-Job-Lite 为轻量级无中心化解决方案,使用 jar 包提供分布式任务的调度和治理。 Elastic-Job-Cloud 是一个 Mesos Framework,依托于Mesos额外提供资源治理、应用分发以及进程隔离等服务。

  • 功能特点

分布式调度协调弹性扩容缩容失效转移错过执行作业重触发作业分片一致性,保证同一分片在分布式环境中仅一个执行实例

补刀:人家官网这样描述的,这里赘述一下,充实一下文章。

  • 基础框架结构

该图片来自ElasticJob官网。

SpringBoot2中怎么整合ElasticJob框架

由图可知如下内容:

需要Zookeeper组件支持,作为分布式的调度任务,有良好的监听机制,和控制台,下面的案例也就冲这个图解来。

3、分片管理

这个概念在ElasticJob中是最具有特点的,实用性极好。

  • 分片概念

任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

场景描述:假设有服务3台,分3片管理,要处理数据表100条,那就可以100%3,按照余数0,1,2分散到三台服务上执行,看到这里分库分表的基本逻辑涌上心头,这就是为何很多大牛讲说,编程思维很重要。

  • 个性化参数

个性化参数即shardingItemParameter,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码。

场景描述:这里猛一读好像很飘逸,其实就是这个意思,如果分3片,取名[0,1,2]不好看,或者不好标识,可以分别给个别名标识一下,[0=A,1=B,2=C]。

二、定时任务加载

1、核心依赖包

这里使用2.0+的版本。

<dependency>    <groupId>com.dangdang</groupId>    <artifactId>elastic-job-lite-core</artifactId>    <version>2.1.5</version></dependency><dependency>    <groupId>com.dangdang</groupId>    <artifactId>elastic-job-lite-spring</artifactId>    <version>2.1.5</version></dependency>

2、核心配置文件

这里主要配置一下Zookeeper中间件,分片和分片参数。

zookeeper:  server: 127.0.0.1:2181  namespace: es-jobjob-config:  cron: 0/10 * * * * ?  shardCount: 1  shardItem: 0=A,1=B,2=C,3=D

3、自定义注解

看了官方的案例,没看到好用的注解,这里只能自己编写一个,基于案例的加载过程和核心API作为参考。

核心配置类:

com.dangdang.ddframe.job.lite.config.LiteJobConfiguration

根据自己想如何使用注解的思路,比如我只想注解定时任务名称和Cron表达式这两个功能,其他参数直接统一配置(这里可能是受QuartJob影响太深,可能根本就是想省事…)

@Inherited@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface TaskJobSign {    @AliasFor("cron")    String value() default "";    @AliasFor("value")    String cron() default "";    String jobName() default "";}

4、作业案例

这里打印一些基本参数,对照配置和注解,一目了然。

@Component@TaskJobSign(cron = "0/5 * * * * ?",jobName = "Hello-Job")public class HelloJob implements SimpleJob {    private static final Logger LOG = LoggerFactory.getLogger(HelloJob.class.getName()) ;    @Override    public void execute(ShardingContext shardingContext) {        LOG.info("当前线程: "+Thread.currentThread().getId());        LOG.info("任务分片:"+shardingContext.getShardingTotalCount());        LOG.info("当前分片:"+shardingContext.getShardingItem());        LOG.info("分片参数:"+shardingContext.getShardingParameter());        LOG.info("任务参数:"+shardingContext.getJobParameter());    }}

5、加载定时任务

既然自定义注解,那加载过程自然也要自定义一下,读取自定义的注解,配置化,加入容器,然后初始化,等着任务执行就好。

@Configurationpublic class ElasticJobConfig {    @Resource    private ApplicationContext applicationContext ;    @Resource    private ZookeeperRegistryCenter zookeeperRegistryCenter;    @Value("${job-config.cron}") private String cron ;    @Value("${job-config.shardCount}") private int shardCount ;    @Value("${job-config.shardItem}") private String shardItem ;        @Bean    public ElasticJobListener elasticJobListener() {        return new TaskJobListener();    }        @PostConstruct    public void initTaskJob() {        Map<String, SimpleJob> jobMap = this.applicationContext.getBeansOfType(SimpleJob.class);        Iterator iterator = jobMap.entrySet().iterator();        while (iterator.hasNext()) {            // 自定义注解管理            Map.Entry<String, SimpleJob> entry = (Map.Entry)iterator.next();            SimpleJob simpleJob = entry.getValue();            TaskJobSign taskJobSign = simpleJob.getClass().getAnnotation(TaskJobSign.class);            if (taskJobSign != null){                String cron = taskJobSign.cron() ;                String jobName = taskJobSign.jobName() ;                // 生成配置                SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(                                                JobCoreConfiguration.newBuilder(jobName, cron, shardCount)                                                .shardingItemParameters(shardItem).jobParameter(jobName).build(),                                                simpleJob.getClass().getCanonicalName());                LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(                                                simpleJobConfiguration).overwrite(true).build();                TaskJobListener taskJobListener = new TaskJobListener();                // 初始化任务                SpringJobScheduler jobScheduler = new SpringJobScheduler(                                                simpleJob, zookeeperRegistryCenter,                                                liteJobConfiguration, taskJobListener);                jobScheduler.init();            }        }    }}

絮叨一句:不要疑问这些API是怎么知道,看下官方文档的案例,他们怎么使用这些核心API,这里就是照着写过来,就是多一步自定义注解类的加载过程。当然官方文档大致读一遍还是很有必要的。

补刀一句:如何快速学习一些组件的用法,首先找到官方文档,或者开源库Wiki,再不济ReadMe文档(如果都没有,酌情放弃,另寻其他),熟悉基本功能是否符合自己的需求,如果符合,就看下基本用法案例,熟悉API,最后就是研究自己需要的功能模块,个人经验来看,该过程是弯路最少,坑最少的。

6、任务监听

用法非常简单,实现ElasticJobListener接口。

@Componentpublic class TaskJobListener implements ElasticJobListener {    private static final Logger LOG = LoggerFactory.getLogger(TaskJobListener.class);    private long beginTime = 0;    @Override    public void beforeJobExecuted(ShardingContexts shardingContexts) {        beginTime = System.currentTimeMillis();        LOG.info(shardingContexts.getJobName()+"===>开始...");    }    @Override    public void afterJobExecuted(ShardingContexts shardingContexts) {        long endTime = System.currentTimeMillis();        LOG.info(shardingContexts.getJobName()+        "===>结束...[耗时:"+(endTime - beginTime)+"]");    }}

絮叨一句:before和after执行前后,中间执行目标方法,标准的AOP切面思想,所以底层水平决定了对上层框架的理解速度,那本《Java编程思想》上的灰尘是不是该擦擦?

三、动态添加

1、作业任务

有部分场景需要动态添加和管理定时任务,基于上面的加载流程,在自定义一些步骤就可以。

@Componentpublic class GetTimeJob implements SimpleJob {    private static final Logger LOG = LoggerFactory.getLogger(GetTimeJob.class.getName()) ;    private static final SimpleDateFormat format =            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;    @Override    public void execute(ShardingContext shardingContext) {        LOG.info("Job Name:"+shardingContext.getJobName());        LOG.info("Local Time:"+format.format(new Date()));    }}

2、添加任务服务

这里就动态添加上面的任务。

@Servicepublic class TaskJobService {    @Resource    private ZookeeperRegistryCenter zookeeperRegistryCenter;    public void addTaskJob(final String jobName,final SimpleJob simpleJob,                           final String cron,final int shardCount,final String shardItem) {        // 配置过程        JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(                                                    jobName, cron, shardCount)                                                    .shardingItemParameters(shardItem).build();        JobTypeConfiguration jobTypeConfiguration = new SimpleJobConfiguration(jobCoreConfiguration,                                                    simpleJob.getClass().getCanonicalName());        LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(                                                    jobTypeConfiguration).overwrite(true).build();        TaskJobListener taskJobListener = new TaskJobListener();        // 加载执行        SpringJobScheduler jobScheduler = new SpringJobScheduler(                simpleJob, zookeeperRegistryCenter,                liteJobConfiguration, taskJobListener);        jobScheduler.init();    }}

补刀一句:这里添加之后,任务就会定时执行,如何停止任务又是一个问题,可以在任务名上做一些配置,比如在数据库生成一条记录[1,job1,state],如果调度到state为停止状态的任务,直接截胡即可。

3、测试接口

@RestControllerpublic class TaskJobController {    @Resource    private TaskJobService taskJobService ;    @RequestMapping("/addJob")    public String addJob(@RequestParam("cron") String cron,@RequestParam("jobName") String jobName,                         @RequestParam("shardCount") Integer shardCount,                         @RequestParam("shardItem") String shardItem) {        taskJobService.addTaskJob(jobName, new GetTimeJob(), cron, shardCount, shardItem);        return "success";    }}

关于SpringBoot2中怎么整合ElasticJob框架就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot2中怎么整合ElasticJob框架

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot2中怎么整合ElasticJob框架

这篇文章将为大家详细讲解有关SpringBoot2中怎么整合ElasticJob框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、ElasticJob简介1、定时任务在前面的文章中,说过
2023-06-02

SpringBoot2中怎么整合Mybatis框架

SpringBoot2中怎么整合Mybatis框架,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Mybatis框架1、mybatis简介MyBatis 是一款优秀的持久层框
2023-06-02

SpringBoot2中怎么整合ElasticSearch框架实现高性能搜索引擎

SpringBoot2中怎么整合ElasticSearch框架实现高性能搜索引擎,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、核心依赖 <
2023-06-02

SpringBoot2中怎么整合Kafka组件

SpringBoot2中怎么整合Kafka组件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、搭建Kafka环境1、下载解压-- 下载wget http://mirror.b
2023-06-02

SpringBoot2 整合SpringSecurity框架是怎么实现用户权限安全管理

这篇文章给大家介绍SpringBoot2 整合SpringSecurity框架是怎么实现用户权限安全管理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、Security简介1、基础概念Spring Security是
2023-06-05

SpringBoot怎么整合JPA框架

这篇文章主要介绍了SpringBoot怎么整合JPA框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么整合JPA框架文章都会有所收获,下面我们一起来看看吧。一. Spring Boot数
2023-07-04

SpringBoot2中怎么整合ClickHouse数据库

这期内容当中小编将会给大家带来有关SpringBoot2中怎么整合ClickHouse数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、ClickHouse简介1、基础简介Yandex开源的数据分析
2023-06-02

SpringBoot2如何整合Shiro框架实现用户权限管理

小编给大家分享一下SpringBoot2如何整合Shiro框架实现用户权限管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Shiro简介1、基础概念Apac
2023-06-02

怎么在springboot中整合jquery和bootstrap框架

这篇文章主要介绍了怎么在springboot中整合jquery和bootstrap框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在springboot中整合jquery和bootstrap框架文章都会有
2023-06-17

SpringBoot2如何整合JWT框架解决Token跨域验证问题

小编给大家分享一下SpringBoot2如何整合JWT框架解决Token跨域验证问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、传统Session认证1、认
2023-06-02

springboot框架中如何整合mybatis框架思路详解

这篇文章主要介绍了springboot框架中如何整合mybatis框架,本文通过示例图文相结合给大家介绍的非常详细,需要的朋友可以参考下
2022-12-20

SpringBoot2 高级应用(12):整合 SpringSecurity 框架,实现用户权限安全管理

本文源码:GitHub·点这里 || GitEE·点这里一、Security简介1、基础概念Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring
2023-06-02

怎么用Springboot快速整合shiro安全框架

这篇文章主要介绍“怎么用Springboot快速整合shiro安全框架”,在日常操作中,相信很多人在怎么用Springboot快速整合shiro安全框架问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Sp
2023-07-05

SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用

SpringBoot2中怎么利用Dubbo框架实现RPC服务远程调用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Dubbo框架简介1、框架依赖图例说明:1
2023-06-02

Java springboot整合Shiro框架的方法是什么

本篇内容主要讲解“Java springboot整合Shiro框架的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java springboot整合Shiro框架的方法是什么”吧!Sh
2023-06-26

Linq整体框架是怎么样的

这篇文章主要介绍Linq整体框架是怎么样的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!LINQ,语言集成查询,就是把一些查询操作集成到语言中(貌似是废话),比如查询关系数据库,而且提供一种一致的操作方式,不管最终的
2023-06-17

springboot整合quartz定时任务框架的方法是什么

今天小编给大家分享一下springboot整合quartz定时任务框架的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
2023-06-26

SpringBoot中怎么整合Redis

SpringBoot中怎么整合Redis,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、安装首先要在本地安装一个redis程序,安装过程十分简单(略过),安装完成后进入到
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录