00:00
好,我们接下来呢,我们就开始写这个监控买CQ,呃,表里边的某一个字段的空值率的,呃,相关的一些任务的代码,对吧?当然你在写这个之前的话呢,呃,第一步我们要做的事情,实际上就是先做一个调度器出来,对吧?也就是说你现在我们整个spring boot应用里面其实并没有调度器,所以说在这儿的话呢,呃,我们会当然就是这个调度器的类,它放在哪里的话呢?呃,我这边就给它放在病里边吧,可能也不一定太合适,对吧,但是可能也没必要说是再新建一个。文件夹来放这个代码,那么这个类的名字呢,叫做quotes schedule,对吧,Quas schedule。呃,然后呢,我们在这的话呢,我们是实现单利模式,呃,这个单利模式的意思是什么意思,就是整个spring boot服务只有一个调度器存在对吧?我们实际上是想要实现这样一个功能,当然在这的话呢,我要实现单立模式的话,呃,首先就是我要有一个静态变量,对吧?那它的类型呢,是呃,Schedule的类型对吧?好,那么它等于什么呢?它的初始值是一个now,呃,然后呢,我在这里边的话呢,我再来一个public static,它的返回值是schedule,对吧?然后呢,我的方法呢,叫做instance吧,也就是说获取一个呃调度器的实例对吧?当然我们由于我们是单利模式,所以说你不管调用这个get instance呃多少次,对吧?它返回的呢,应该都是同一个实例才对,对吧?所以说在这的话,我。
01:49
就是呃,抛出一个异常,然后呢,如果SKY这个静态变量等于钠,对吧,如果它等于now的话,那我们就要实例化一个新的出来,对吧?Factory等于你有一个std。
02:10
Schedule factory对吧,我们有一个实例化,一个工厂类,然后呢,Schedule等于factory第2GET,对吧,你可以看到说只有当静态变量为空的时候,我们才会做一次实例化对吧?那你实例化完以后呢,那这个静态变量呢,它就永远不会空了。对吧,所以说我每次当我们第一次调用get的时候呢,SKY是为空,然后我们实例化一个调度器出来,那么之后再调用的话呢,我们就直接返回这个静态变量就可以了,对吧?那这样的话呢,我们就呃实现了单立模式啊,那在这儿的话呢,我就有了一个跨次的调度器的这样的一个类,对吧?呃,那么我们有了这样一个类以后呢,我们就可以在云台application这里,对吧,也就是说。
03:02
随着服务启动的时候,我们就可以启动这个定时任务调度器,对吧?那么怎么启动呢?当然就是呃跨次schedule.get instance.start对吧?那这样的话我们就启动了这个呃定时任务,当然就是说他在这儿的话呢,需要抛一个异常对吧。也就是说我们在云台application里面呢,呃,注入了这么一行代码,那么当我们启动这个后端服务的时候呢,它执行这个main函数,对吧,执行完上来以后呢,它就启动了一个定时任务调度器,好,呃,所以说呢,哎,我们现在呃启动任务调度器的代码也已经写好了,那么接下来的话呢,我们就可以开始写一下这个,呃。监控的这样的一个代码对吧,当然你在写监控代码之前的话呢,呃,我们还是要定义一个并类,因为你这个监控的结果对吧,呃,你是需要写到数据库里边的,所以说我们这个就是more detail detail对吧,那这个就是一个。
04:12
监控的结果,它的一个并类对吧,监控的结果。所对应的病类需要写到数据库里面对MYCQ某个字段空值率的监控结果。对吧,那么它需要写到呃,数据库里边的,当然第一个的话呢,是什么呢?那就是data base name数据库的名字,第二个的话呢,就是。Table name对吧,那这个是什么呢?这个是表明,那第三个的话呢,就是F的那要监控的字段名。
05:01
呃,当然最后一个的话呢,就是一个field now rate对吧,字段的控制率好。呃,那有了这些以后呢,我们就可以开始生成一些样板代码,第一个是空构造器,呃,或者叫做空参构造器,对吧?那么第二个的话呢,是一些get。OK,然后呢,把给它写呃自动添加进来,好,那这样的话呢,我们monitor detail呢也就写好了,那写好以后呢,呃,我们就可以开始写这个呃任务了,当然呃就是说我们这里边的这个任务类型。对吧,其实我这里面只有两种任务类型,呃,对吧,这里面任务类型呢,第一种一个是简单任务对吧。呃,那么第二个的话呢,就是字段空值率监控任务,对吧,我只有这两个任务,呃,所以说我们这里边的话呢,我们就要呃来实现两个呃,Job。
06:10
那第一个job的话呢,那就是simple job对吧,简单任务嘛,呃,然后呢,我们把这个simple job呢,我们就直接把这里边的这个simple job呢,给它拷贝过来就可以了,对吧,我们直接给它拷贝过来,好,这个实际上是用来做测试用的啊呃,就给它测试一下。呃,我们的这个。定时调度模块可不可以正常使用对吧?呃,那这个是simple job,那么还有一个是什么呢?还有一个就是,呃,叫做我们来看一下my monitor。对吧,当然这个也是一个Java类,呃,所以说在这的话呢,你需要实现什么呢?你需要实现这个,呃,Job这个接口,对吧,你需要实现job接口,然后呢,我们需要一个空参构造器,呃,好,那除了空间构造器以外呢,当然我要把这个。
07:09
呃,Job的业务逻辑呢,我要写在这个里边,对吧,写在这个里边,呃,我们的这个job呢。它是需要接收参数的,因为你在跑这个job之前的话呢,对吧,我们每一次。注册一个,呃,这样的监控任务的时候呢,你并不知道它的数据库的名字对吧?表名以及字段名这些你都是不知道的,对吧?所以说我们需要有一种方式呢,来对这个作业呢,来进行传参数,对吧,那这个就是。传进来,传进来的参数字典对吧?那么这个参数字典如何去获得呢?那就是y data map等于一个上面有一个上下文job execution。
08:03
Context,这个上下文呢,Get job detail对吧?获取任务的详情,然后get job,呃,Data map,然后呢,取出传进来的参数对吧?我们传进来的参数呢?呃,我们有三个要传进来参数,第一个就是data base name等于data map.get string对吧?那这个就是我们要传进来的数据库的名字,那第二个的话呢,是table name,呃,Data map.get string table name好,那第三个的话呢,就是字段名对吧,Field name data map.get string field name对吧?这个就是传进来的字段名,好。啊,那我们的取出传递来的参数来以后呢,那接下来我们就要来编写任务的业务逻辑了。
09:03
对吧,呃,当然这个任务的业务逻辑呢,呃,比较简单对吧?因为我们要监控的是某一个字段的空值率的话呢,那我们肯定是,呃,需要写一些简单的CQL,基本上就把它搞定了,对吧?所以我们这边还是try catch exception对吧,然后呢,Class not found exception对吧,然后1.printstas,我们。把这个异常呢给它捕获一下好,然后接下来的话呢,我们在这的话呢,是class.four name,然后呢,Com点买Cq.CG.gdbc.driver好OK,我们设置这个驱动类connection等于。Driver manager get对吧?当然你这个连接的话,你肯定是连接我们要监控的数据库,对不对,所以说这个的话呢,我们需要做一个字符串拼接,JDBC冒号MYCQL冒号双斜杠,Localhos冒号3306。
10:11
对吧,然后写放,然后呢,我们在这呢,我们给它加上一个database name,然后再加上一个问号use s SL等于false对吧?Root我们的用户名是root,密码也是root好,那这样的话呢,我们的呃连接呢,就已经创建好了,那么连接创建好之后的话呢,我们现在来呃实例化一个类对吧?我们实例化一个什么样的类呢?我们实例化一个monitor detail等于new一个。呃。Monitor detail这样的一个类,好,然后呢,我们先把一些已知的字段给它附上,比方说database name对吧?呃,那这个我就直接把database name给它填进去就行了,然后monitor detail.set table name对吧?那把它填进去也可以了,然后呢,Monitor detail field name,哎,把这个传进来的参数给它填进来好。
11:13
然后接下来的话呢,我们就开始写这个select statement,也就是查询语句connection.prepare statement对吧?呃,那么我们怎么样样要计算一个空值率呢?那显然就是呃,我把这个字段里边的空值的数量呃数出来对吧?然后再除以呃表里的所有数据的数量对吧?那么这样的话就计算出来一个呃空值率对吧?所以我在这的话呢,我就select。Select什么呢?呃,首先第一个COUNT1,那这个表示什么呢?As as total,哦,对吧。
12:06
这个total out实际上就是你COUNT1嘛,那就是把呃就是说统计一下表里面一共有多少条数据对吧?这COUNT1就是数一下表返回的呢,是表里边的一个数据总量,或者说叫做行数对吧?啊那这是第一个,呃,那第二个的话呢,我们要取的一个字段呢,那就是count,然后加上一个什么呢?对吧?我们要监控的是一个F的name对吧?我们数一下呃这个字段对吧?我们数一下这个字段,然后呢,呃,数一下这个字段什么呢?数一下这个字段非空的,也就是total not,那对吧?呃,就是这个字段它非空值的数量一共有多少对吧?然后呢,我们再来计算一个count。呃,然后呢一,那这个就是总量了,对吧?总数量减去count field name对吧?然后加上一个,呃,当然我们还是字符串拼接,呃,右括号as头头呢,对吧。
13:23
啊,当然你说你这样一剪的话呢,它剪出来什么呢?那剪出来的就是你这个字段有多少个nu对吧,就是有多少个空值好OK啊,那么紧接着的话呢,诶,我们再计算一下它的空值率,当然在这里面的话呢,我们需要一个呃100来乘一下对吧,然后呢,加上一个field name,再加上一个。呃,右括号。然后呢,除以什么呢?除以COUNT1AS,然后这个呢,就是percent not now对吧?啊,那这个就是我们的空值率了啊,当然你在这你不要忘记它是一个from,再加上一个table name,好,那这样的话呢,我们就把空值率给计算出来了,呃,然后呢,我们result set等于一个select statement.xte query对吧,执行一下呃,这个。
14:27
查询语句,如果我们查到了结果的话,就是说result set.next等于true的话呢,呃,我们就把这个字段呢给它set进去,对吧。点get double哪个字段呢?我们要取的是percent not,那对吧,非空值率对吧?实际上是我们计算的,呃,是一减去空值率对吧?也就是说呃,非空值率是多少对吧?Percent not now,那你一减去它的话呢,那就是呃,就是空值率了,好。
15:03
当然我们的查询结果呢,我们是需要插入到另一张表的,对吧,也就是说监控结果插入到另一张表。其他表对吧,好,那这个监控结果怎么插入呢?首先我们就是insert。Ver insert connection,因为我们需要开一下呃,另一张表的这个连接,然后driver manager get connection对吧?呃,然后在这里面的话呢,我们就是一个我们写到哪张表呢?我们写到这个,就你随便建一张表都可以,对吧,因为我们是测试嘛。LOCAL3306斜杠云台government对吧。云台监控这个数据库里边,对吧,我们要写到这个数据库里边,然后呢,Root root好。
16:09
OK,那我们有了这样的一个连接以后呢,我们就来构建一个插入语句,Statement等于insert对吧,点prepare好,那么在这的话呢,就是一个in。等一下啊,Insert into my data monitor对吧?但是如何建这张表呢?我们在文档里面其实也已经有了啊,好,然后在这的话呢,我们要插入的是data base name,对吧,Table name,然后呢,Field name。Field,那其实这里面写的不太准确啊,实际上我们呃要插入的呢,是这个非空指率对吧,好问号问号逗号问号。
17:12
逗号问号对吧,一共有四个,呃,就是说这样的站位符,那我们来看一下。这里边呃,我们用到的这个表对吧,实际上在呃监控模块的话呢,其实我们已经呃告诉大家对吧。呃,就是说这个MySQL data monitor,你呃怎么样去创建这样的一张表,对吧,其实是非常简单的,其非常简单的好,呃,所以说你看文档你就知道这张表呢,它如何去呃创建对吧,它如何去创建好,然后在我们构建这个插入语句以后呢,我们就开始呃把这个。空呃,就是说占位符呢,给它呃填充一下对吧,Table name好,Insert statement.set string对吧。
18:07
第三个的话呢,就是field那个insert点。Set double对吧,那么这个是第四个,那么就是。Monitor detail get,好,不要忘记执行它。OK,那这样的话呢,我们插入的操作对吧,就把监控结果保存到表里面的操作呢,也就做完了啊,当然你不要忘记关闭连接对吧,因为在这的话呢,还有一个insert connection我需要关闭掉,然后呢,还有一个就是select statement这个语句需要关闭掉insert。Statement。对吧,也需要给它关闭掉,好,那这样的一个任务的话呢,呃,我们就已经完成了,所以你看到这个任务呢,非常非常简单,只有六七十行,而且很多还是呃样板代码,对吧,这样的一个任务呢,我们就已经完成了啊,那么完成任务以后呢。
19:10
你如何去触发这个任务的执行,对吧,或者说我我要监控某个数据库里面某张表的某个字段,对吧?我是要从前端创建这样的一个调度任务。然后呢,把这个调度任务呢,作为一个请求发送到后端,然后来启动这个任务,或者说暂停啊等等等等,对吧,它都是从前端发请求过来的,所以说我们在这儿的话呢,我们就需要一个什么呢,我们就需要控制器的配合了,对吧?也就是说我们这里面我们呢是呃需要写一些控制器的呃代码对吧?好,那在这儿的话呢,我们就来写一个叫做。什么呢?叫做schedule controller,呃,这样的一个控制器。
20:03
啊,对吧,还是遵循我们之前的编程规则,那么它一定是一个rest controller,然后呢,Request mapping。Schedule对吧,这是我们的UR的映射,好,那么第一个的话呢,是获取所有作业的。呃,这样的一个API对吧,然后呢,在这的话呢,就是我们的API呢,给它定义为一个get all。Jobs,对吧?然后呢,Public result,我们的返回值呢,当然就是一个schedule job info这样的一个列表,对吧。对吧,然后这个呢是get all jobs OK,然后我们直接return一个result.of200success,然后呢。
21:05
Schedule service。点get all jobs好,那这样的话,我们就把所有的呃,作业的API呢,就都给它返回了,那接下来的话呢,我们是一个暂停作业的API,对吧。也就是说我如何通过发送请求的方式把一个作业给他暂停掉呢?对吧?或者说当然这个就是我们接收请求以后,呃调用跨S的API,我们就可以把它呃给暂停掉,对吧?当然它是一个POS请求,那么它这个请求的URL呢,是PS job。Public result string,然后呢,Post job,然后我们的这个请求体对吧?呃,我们会把它反序列化成一个schedule job for,呃,这样的一个Java类。
22:10
对吧,然后呢,我们这边需要抛一下异常,因为我们要获取这个调度器,对吧,Y4该等于。跨schedule.get instance,对吧,你要注意呃,由于是单力,所以说在呃,不管你在哪去调用这个get instance,它指向的都是同一个调度器的实例,然后呢,我们暂停任务,那么你怎么去暂停一个任务呢,对不对?那么在quas里边呢,我们暂停任务的话呢,只需要知道他的作业名和作业组,或者说任务名和任务组我们就可以暂停了,对吧,我们调用什么呢?Schedule了点post job,然后new一个job key,也就是他每一个job。独一无二的标识是什么呢?对吧,是他的作业名以及作业组,这个就是他的独一无二的,呃,就是说一个作业的独一无二的标识,好,那这样的话呢,我们就暂停任务了,对吧?当然你把任务暂停以后呢,我还是需要。
23:20
对吧,写入数据库的,那在这的话呢,就是jobo.set job status对吧,已暂停,我们把它的状态呢,改变为已暂停,然后schedule。service.post job对吧,然后我们把这个在数据库里边,它的这个作业的状态呢,我们也给它改变一下,好,然后return呢,Is that of。Success任务暂停好,呃,也就是说我们这里边做的事情其实什么呢?其实就分两步走,第一步,呃,你在调度器这呢,你要调用post job,呃,把它暂停掉,然后第二步呢,你要变更数据库里边这个作业的,呃,就是说状态对吧,你要把它变更成已暂停好,所以说我们接下来的话呢,我们再来写一个什么呢?呃,重启作业的这样一个API,当然它代码几乎是一样的,对吧?比如说在这的话,我就写一个重启作业的API,那么在这儿的话呢,诶。
24:35
既然你重启完以后呢,那么它的状态应该改为运行中了,对吧?改为运行中了,呃,当然你在这边你要调用的呢,应该是resume job对吧?呃,重启一个作业好,然后把这个方法名呢给它改成resume就可以了啊,那这样的话呢,然后我们在这我们再来改一下对吧,那这样的话呢,我们就写完了。
25:03
呃,当然除了重启作业的API呢,呃,我们还需要一个删除作业的API,对吧?呃,我们其实可以复用。这些代码我们可以复用。这些代码好。啊,那么这个是删除作业的API,然后呢,在这的话呢,诶,我上面可能这需要改一下,对吧,这没改。呃,这个URL映射这里resume,我改一下,然后底下的这个呢,我改成一个delete job对吧,然后这个函数名呢,我给它改一下,改成the little job对吧。呃,然后呢,我们在这的话呢,呃,由于你要删除作业的这个API的话呢,首首先第一步的话呢,当然就是诶这个这改成重启任务。把它改成删除任务对吧?呃,所以说你要调用这个调度器的API,那么这个API是什么呢?这个API是the delete job对吧?啊,我们先在调度器里边把这个任务删掉,呃,虽然说我们没有使用买CQ作为持久化这个定时任务的,呃,一个呃数据库对吧?也就是说它的调度器里边的作业呢,都是默认存在内存里边的,但是你在那你同样要调用delete job呢,把它从内存里面把这个作业给删掉,对吧。
26:32
同时呢,呃,我们任务详情的。这个我们也要删掉,对吧,从数据库里面删除。好,那在这的话呢,那就是一个delete job对吧,你。啊,就是说保存这个作业详情的数据库表里面的这个作业,嗯,你也要同样删除对吧,你也要同样删除好。OK,然后呢,我们在这的话呢,呃,我们来写,实际上这几个控制器都不是特别复杂对吧?呃,那接下来的话呢,我们就来写什么呢?我们就来写创建一个新作业的API对吧?好,创建一个新作业的API。
27:16
呃,那么首先我在这儿的话呢,我要初始化一个全局变量,那这个全局变量用来干嘛呢?就是触发器计数对吧?呃,因为我需要针对每一个触发器呢,我都给它一个独一无二的触发器的ID,对吧?所以说在这的话呢,我需要有一个计数器,那就是private static int trigger count等于。零对吧,那后面你就知道它怎么用了,其实非常非常简单,那在这的话呢,我是一个post请求,呃,然后呢,我的这个URL呢是create job。然后呢,我有几个路径参数。
28:00
呃,Database name,对吧?就是如果你是一个呃数据库监控任务的话呢,那么我们就把呃数据库的名字呀,包括表的名字,呃,包括这个字段的名字呃都在路径参数里面给它传进来,对吧?当然就是这样显得呃其实并不是那么优雅或者舒服对吧?呃,你也可以选择把它打包在请求体里边呢,这也是没有任何问题的对吧?这也是没有任何问题的。呃,呃,当然就是我们说明问题就好了,对吧?我们说明问题就好了,Public返回值,Result string create job。然后呢,第一个参数request body。Schedule job in for对吧,Job in,那第二个参数。路径参数string name,第三个参数对吧?String table name啊,那最后一个参数呢,当然就是,呃,还是一个路径参数,那就是我们的啊,Field name好。
29:21
呃,然后不要忘记抛出一个异常。Throw exception,然后呢,我们开始写方法体对吧?呃,当然你写方法体的时候呢,首先我还是要获取调度器,等于。Qua schedule get instance啊,我获取完调度器以后呢,我就开始对吧,判断任务类型。然后创建对应的作业对吧,那么如果,呃,当然在这的话呢,我首先是一个job,我先声明一个job detail好。
30:07
呃,然后呢?如果作业类型。Job引付点get job type。点ES对吧?等于什么呢?等于简单类型,然后测试,因为这个会从前端传过来啊,也就是如果他的作业是一个呃,简单任务,然后测试用的,那么我们在这我们要产生的一个任务详情是什么呢?那么就是job detail,它就应该等于job builder.new。Job对吧,新建一个任务,那我新建的什么任务呢?那就是。Simple job.class对吧?我要新建的是一个呃,打印一个语句的简单任务,然后呢,它的标识符是我们的这个作业名。
31:10
以及他的作业小组对吧。然后build,哎,这样的话呢,我就呃生成了一个任务对吧,我就构建出了一个任务,然后else的话,那其他的,因为我们只有两种任务类型嘛,第一种是简单任务,那第二种是呃,就是说监控数据库某张表的某个字段的空值率的这样的一个任务,对吧?所以说else它自然就是一个监控呃字段控制率的这样的一个任务,然后呢,Job data等于一个new。Job data map,因为我们要往那个定时任务里面传几个参数,对吧,所以说我在这的话呢,呃,我需要new一个job data map,也就是说作业数据的这样的一个字典,然后呢,我们把参数给它传进去,那么定时任务呢,就可以接到了,好,我传的第一个参数呢,是database name,然后我传的第二个参数呢,Table name。
32:17
我传的第三个参数呢,是field的name对吧,你这传了参数以后,然后开始调度任务的话呢,那我这边的这个作业呢,它就可以从job data map里面呢,把传过来参数呢,给它取出来,对吧,这是传参数。对吧,我们这边可以写一下向任务传参数,好像任务传参数。OK,那我们传完参数来以后呢,我们还是构建一个任务详情,那么这个任务详情的话呢,还是job builder,点点new job对吧,那么这个就是一个myq monitor job class了。
33:08
好,然后呢,我们是一个with identity。他的,哎,唯一标识job info,点呃,Get job group对吧,就是作业名和作业组组成了这个作业的唯一标识,然后点set job data这一句就是把我们上面的呃,那个字典呢,当参数给它传进去,然后build好,这样的话呢,我们通过if else呢,我们就构建好了作业,对吧?然后接下来的话呢,我们就要新建触发器了,对吧,我们要保证每次新建的这个触发器呢,它都是一个全新的触发器啊,因为这个对于每一个任务的话呢,你尽量实际上。为他创建呃,不同的独一无二的这样的一个触发器,对吧,再让我们首先声明一个触发器,呃,然后呢,我们就是说如果。
34:03
Job info.get crown job对吧?如果它为真的话,这说明什么呢?如果作业是crown作业,那么我们应该怎么做呢?我们应该怎么构建这个触发器呢?那就是trigger等于new trigger对吧?呃,它这个静态方法我们直接给它导进来。好。New trigger,然后点with identity吧,对吧,我们把这个触发器给它构建成独一无二的,然后呢,为怎么构建独一无二呢?我们就是trigger加上一个前面声明的全局变量的这样一个计数器。那么第二个的话,那就是job for.get job group了,对吧?呃,也就是我们的作业组对吧,那这样的话呢,我通过这一对数据呢,就可以保证我这个触发器呢是独一无二的,然后点with schedule对吧。
35:02
然后这个schedule,也就这个调度类型是什么呢?它是一个C作业调度,所以我们在这儿我们要使用。Schedule。对吧,当然这个是一个静态的,呃。等一下,我们先调用它吧。呃,Crown schedule,然后呢,Job info get crown exception,也就是你在这儿你会发现我想要调度CN任务的话呢,我只需要调用一个在触发器里面调用一个with schedule,然后呢,Cn schedule,对吧?然后把这个C表达式给它传进去就OK了,对吧?把这个静态方法导进来,然后呢,我们接下来的话呢,来构建一下这个触发器。对吧,也就是如果它这个壳望作业的话呢,我们就构建这样的一个触发器,如果它不是可望作业的话呢,呃,那我们就构建一个对吧,周期性的触发器对吧?构建周期性执行的触发器好,那在这的话呢,就是trigger等于new trigger.with identity对吧。
36:15
当然在这的话呢,我还是要保证这个trigger呢,是一个独一无二的。所以呢,我们在这的话呢,是做一个字符串拼接,然后呢,Job引o.get呃,Job group,然后它调度方式呢,With schedule呢,它是一个simple schedule,实际上我们这个之前已经写过了,对吧,它是一个简单调用,实际上就是一个简单的周期性调用,对吧?我们把这个静态方法给它弄进来,然后点with。Interval in对吧,然后job for.get。呃,这个repeat time对吧。
37:01
也就是说获取它的,呃,这个周期的大小,对吧,然后呢,Repeat forever,也就是无限执行。然后。对吧,当然你在这边的话,你还可以就是说添加一些类似于什么start now之类的,呃,这样的一些东西,对吧,就是说立即执行啊等等等等。我们来看一下啊,它这个SIMPLE6点。我们看一下之前的写的这个代码里边。对吧,With simple r,我们这可以直接给它进行一个立即执行,对吧,我们来看一下,呃,也就是说你在这个with identity之后的话呢,你其实可以调用这个start闹对吧,也就是这个程序呢,呃,这个触发器呢,它的触发方式是立即执行,然后呃,我们根据前端传过来的周期的大小,对吧,然后进行执行对吧,然后进行执行好。
38:04
呃,那我们做完这个触发器的新建之后呢,你不要忘记把这个全局变量给它更新一下,然后呢,我们就可以调度任务了,对吧,怎么调度任务呢?Schedule点。Schedule job对吧,Job detail,然后呢,Trigger,哎,这样的话呢,就开始调度任务了,当然你调度任调度完任务以后呢,别忘了将任务存储到MYCQL中,所以说在这儿的话呢,我们就需要呃调用我们的服务了,当然你首先你需要把它的呃这个作业状态呢置为什么呢,置为运行中,然后呢,Schedule service.add job对吧,Job引付好,然后把它添加到数据库里面就可以了,然后呢,再最终返回一个result这样的一个类型的呃,HTTP响应对吧,Success,然后呢,这个是创建任务成功。
39:15
好啊,那这样的话呢,我们所有的这个调度模块的代码呢,呃,就已经都写完了,对吧,就已经都写完了,那么我们接下来的话呢,我们就来测试一下,呃,看看它能不能正常使用对吧,或者说它是怎么用的。
我来说两句