00:00
嗯,好,那我们大概讲解这下quas的使用以后呢,我们就可以开始写这个定时调度模块啊,当然就是因为quas这个工具呢,它本身呃实际上是比较庞大的对吧?因为它毕竟作为这个Java社区里边最有名的一个定时呃器这样的一个库的话,那么它你想要完全掌握它肯定并不是一节课就能搞定的,对吧?但是呃,我们通过写这样一个程序,我们知道他在做什么,对吧?如果你将来真的有这样的需求的话呢,呃,或者说你在看dolphin该源码的时候呢,那么你就可以呃认真研究一下啊,它到底该怎么用,对吧?好,那我们接下来的话呢,我们就开始写这个调度模块,那么这个调度模块呢,叫做呃什么呢?当然呢,就是叫做schedule吧。好,Schedule,当然我们在这的话呢,我们还是先来创建它必须的几个软件包,对吧,当然你这个病肯定是要创建的,对吧?啊,然后呢,我们新建一个软件包,比方说schedule了点controller,对吧,你也是必须要创建的,然后像这个service。
01:09
啊,对吧,你也是要创建的,呃,那么除了并controller service以外呢,我这里边我会再添加一个软件包,叫做job对吧,用来存放我们的呃要呃执行的一些定时任务对吧?我们就给它放到呃job这个文件夹里面,好,我们接下来我们第一个呢,我们要写的是B这样的一个。呃,扎病这样的一个类对吧?呃,里面的类,那么这个扎va病呢,它的类的名字叫什么呢?它叫scheduler job in for,呃,也就是说这个schedule job info呢?这个就是我们调度对吧?调度的任务详情对吧?那么这个调度的任务详情呢?就是说每个任务详情都会保存在MYCQL中,对吧?那么它对应了MYCQL里面哪张表呢?我们就可以来看一下对吧?在这的话呢,我们,呃。
02:13
Show data basis对吧?呃,当然就是说它建表的语句以及建库的语句呢,我在文档里面已经提供了,大家可以去查找一下,那么就是这个语音台schedule对吧?那这个就是我们呃要呃存放呃就是说schedule的job,也就是我们这个呃调度任务详情这个表的数据库对吧?我们接下来的话呢,我们来看一下呃这个数据库它的结构对吧?你可以看到它是这样子的,呃,当然建表语句的话呢,我已经在,呃就是说。我们的文档里面已经写好了。嗯,它大概有这么一些字段,然后呢,我们要建这样的一个Java,并这样一个类呢。来和这些字段呢,给它,呃,就是说对应上对吧?然后我们每讲一个字段呢,我们就来说明一下它到底是什么意思对吧?对应表哪张表呢?我们对应的是schedule job in for,好,那么在这的话,它有哪些字段呢?啊,当然第一个是ID对吧,Private long ID private long ID这个是什么呢?这个是主键ID,那么第二个的话呢,就是private string job type任务类型对吧?呃,第三个的话呢,是job name,那么这个是任务名,第四个的话呢,是job group,对吧?那这个是任务组对吧?那么这个是所属的任务小组。
03:56
那么还有一个呢,就是我们的,呃,这样的一个job status对吧,这个就是我们的什么呢?任务状态对吧?当然我们这里面我们任务状态有几个呢?呃,其实只有两个对吧,一个是运行中对吧?那么第二个的话呢,是已暂停。
04:15
对吧?我们的任务状态有这两个,也就是说我们这个呃,跨次这样的一个定时任务调度器呢,它可以暂停任务对吧,可以重启任务对吧,可以运行一个任务,所以我们这的任务状态呢,就两个,呃,一个是运行中,还有一个是已暂停,那么那么接下来的话呢,我们还有一个呢,是叫做crown expression对吧?那么这个就是C表达式,呃,如果你这个定时任务呢,是一个CN定时任务的话呢,那么呃,我们就需要把这个字段呢给它填上,那么还有呢,就是呃什么呢,Private in t。Repeat time对吧?那这个是什么呢?如果它是一个周期性的执行任务对吧?那么这个是周期执行任务的周期对吧?比方说每十秒钟执行一次对吧?那么这个repeat time呢,它它就是一个十对吧,那么还有一个呢,就是布对吧,Job,那么这个布用来干什么呢?用来做一个标志位,那么就是表示是否是一个crown任务,好,那这样的话,我们这些字段呢,就都已经建完了,那么建完以后呢,你首先来给它来一个空构造器。
05:36
对吧,生成一个构造函数,那么这个是一个空构造器,呃,当然的话呢,我们遵循扎va并的这样一个编编程规范的话呢,我们就给它,呃,生成所有字段的get,对吧,所有字段get好,那从这你也可以看得出来,实际上Java的这个。样板代码是呃着实有点多对吧,当然就是说由于idea呢,呃实际上我们可以做的事情呢,呃就是说我们手敲的这些东西呢,就会比较少了,好啊,那么现在有了这样的一个扎并类的话呢,我们接下来其实我们就可以写一个呃写一个什么呢?我们写一个呃服务对吧,那也就是呃这个叫做。
06:20
我们这个叫做什么呢?我们就放在一个类里边吧,那这个服务呢,就叫做sky deal service对吧?呃,当然就是说它这个服务的话呢,当然是对数据库的增删查改,那么我们这里边的话呢,我们是对对吧,云台schedule里边的schedule job ino这张表的一个增删查改,所以在这儿的话呢,呃,我们这个服务的话呢,诶。呃,我们肯定是,呃要对那张表做一些增删查改了,对吧?那么肯定是调用一些GDBC,那么我们第一个呃,方法呢,用来干嘛呢?用来获取所有调度的任务,Public static list,它返回的是schedule job引O这样的一个Java并的列表,对吧?然后呢,API呢是get all jobs,然后在这边的话呢,我来一个TRY,对吧,我们还是直接使用JDBC的方式。
07:17
Q exception,然后呢,Class not11.print对吧?然后return一个new list作为防御对吧?呃,返回空列表,然后呢,我们在这里面的话呢,我们就可以呃给他。建立一个连接,Connection等于driver manager get。呃,Connection,那么这个ul呢,是DBC冒号MYCQ冒号双斜杠,Local host冒号3306。对吧?呃,大家继续写个云台schedule问号use s SL等于false对吧,然后呢,Root。
08:09
诶,这个是一个root,然后密码也是root。OK,呃,当然你可能需要指定一下它的这个class.for name对吧,指定一下它驱动类com点买CQL点。对吧,我们看一下,我们直接从墙面贴过来吧。在这的话呢,那应该是这个service,哎。看买c.CG.gdbc.driver对吧,我们就直接用这个driver就好了,好。呃。OK。然后呢,我们在这写一个分号,好,这样的话我们就建立了一个获取一个连接,当然不要忘记把这个链接给它关闭掉,对吧?然后呢,我们就开始呃,做这样的一个查询语句,那么就是va select statement等于。
09:06
呃,connection.prepare statement对吧?啊,当然这个语句非常简单啊,我们就直接select芯from schedule_job下划线引O对吧?把所有的数据都取出来,然后呢,Y一个result set等于select statement.ex query result呢,等于一个new a list对吧?里边的泛型呢是呃,Schedule job ino,然后分号好,然后我们开始取数据,Result set.next。然后呢,我们现在的话呢,首先你实例化一个schedule job info等于new一个schedule job ino,好,然后呢,我们开始把它每一个字段都给它填上,首先呢是set ID result set.get long对吧?那么这个是ID,呃,然后接下来的话呢,就是schedule的job ino.set。
10:17
Job name对吧?那么这个就是result set.get string,呃,我们这个字段名呢,是job name schedule job.set job group对吧?那这个就是我们的呃组,然后result set.get string,呃,Job group对吧?好,Schedule job。一个job type result set.get string job type好,Schedule job.set实际上这些都是呃样板代码对吧?呃,好点get job status呢也是一个get string,然后呢,它的字段名呢是get status,然后schedule job.set。
11:11
呃,B set.get布尔值,那么这个就是呃,Job对吧?好啊,然后呢,还有一些字,其他的字段,比如说这个ion set.get string crown expression,对吧,不是expression好点,Set。Repeat time results点。好,Result set.get in,那么这个字段名呢,就是repeat time OK,呃,也就是它周期的执行时间对吧?好,那么到现在为止呢,我们就把所有的字段都给它取出来了,然后result.add schedule job,对吧?把它填进去,然后呢,Return result返回就可以了,对吧?呃,当然你也可以把这个select statement呢,直接给它关闭掉,好呃,那这个就是获取所有的调度的任务的这样的一个方法我们就都写好了。呃,那么第二个的话呢,就是我们要添加对吧?添加新的需要调度的任务,当然在这里面我添加新的需要调度的任务呢,是把这个任务呢给它写到数据库里边,所以说public state wide。
12:48
对吧,没有任何返回值ADD job。然后呢,Schedule job info job info对吧,那这个就是我们的一个呃接收的参数呢,是这样的一个schedule job后的Java并对吧,然后在这的话呢,我们直接把它呃拷贝过来,因为他们读写的都是同一个数据库对吧?呃实际上都是同一张表。
13:15
然后呢,继续把它拷贝。好。OK,然后在这的话呢,我们有了这个连接以后呢,你还是不要忘记把这个配对操作给它写上啊,然后呢,我们来构建一个插入语句,Where insert statement等于connection.prepare statement,对吧?呃,当然这个CQ语句呢,也很简单,就是呃,可能会稍微长一点,Insert into schedule job for这个数,呃,这张表对吧?然后我们要插入的字段呢,是job name job group job stay。
14:00
对吧,然后呢,还有呃,像这个job type。对吧,还有呢,就是repeat time对吧?呃,还有什么呢。Crown job对吧?是否是一个crown job以及crown expression对吧?啊,那这个就是我们要插入的一些字段了,这个就是我们要插入的一些字段,然后回车我们做一个换行,然后呢,Value,然后呢,我们看一下一共有几个字段啊,1234567呃,对吧,一共有七个字段,所以说我们在这儿的话呢,我们应该是1234567对吧,一共有七个占位符,好,然后我们就开始填占位符了,Insert。Set什么呢?Set string对吧,第一个站位服,那当然就是。Job inf.get job name了对吧?作业名第二个的话呢,就是我们是info.get,呃,Job group对吧,也就任务组,那么第三个的话呢,是什么呢?Job status对吧?
15:18
Job引o.get job status,那么第四个占位符呢,是job type,呃,Job type任务的类型,第四个是job type,然后呢,Job in for.get job type,好,那么最后呃,第五个呢,是一个呃,Repeat time对吧?那么这个就是一个set in了,对吧,第五个字段。12345第五个字段的话呢,五,然后呢,Jobo.get repeat time好,因为它是一个int类型嘛,然后第六个。是一个布尔对吧,那就是job ino.get cn job对吧?那么第七个的话呢,啊,就是一个string,第七个占位符job in for.get crown expression对吧?呃,第七个占位符就是我们的口号表达式,好,然后呢,不要忘记来执行它,对吧?那么执行完以后呢,当然就写到数据库里边,然后把这个语句给它关闭掉,好那这样的话呢,我们新增往数据库里边新增一个任务的,呃,这个功能呢。
16:32
我们就已经写完了,对吧,然后呢,我们在数据库里边,我们需要写些更新任务状态的这样的一些方法,对吧?比方说这个是一个暂停任务,你要注意这里边并没有真正的暂停任务,而是实际上我们只是呃,在数据库里边改变了他的job status这个字段,对吧?实际上是更改数据库中的job。
17:02
Status这个字段对吧,所以说在这的话呢,就是public static void。P job,然后schedule。照影对吧。我们还是把这些样板代码呢,直接给它贴进来对不对。好。然后呢,Catch异常的这个我们也直接给它贴进来,因为它是一个wide,它并没有做什么事情,对吧?然后在这里面的话呢,你不要忘记把它关闭掉,好,然后呢,我们这里边的话呢,我们就有一个暂停任务的话呢,就是one insert statement对吧,实际上这个不是insert statement,它应该是update statement啊,也就是它是一个更新语句connection.prepare statement,好,然后呢,这个是一个update。
18:01
然后呢,Job in对吧,Set job status。Job status。等于已暂停对吧?等于已暂停,然后呢,Y job name等于问号对吧?And job group等于问号对吧?这两个占位符,当然由于我们在这,呃,我们王丽要写汉字,所以说我在这的话,我需要指定一下编码格式,那就是KA。特in coding对吧?等于什么呢?等于UTF8,你这样的话,你才能把这个汉字插插入进去,要不然你插入到数据库里边,如果不指定这个编码的话,插入到数库里面实际上是多多个问号对吧?然后我们在这的话呢,我们还是呃填充占位符job引o.get job name对吧?然后第二个的话呢,是set string。
19:10
然后呢,Job引点get job group好,然后update.exe执行,不要忘记把它关闭掉,那这样的话呢,我们就更改了数据库里面任务的,呃,这样的一个呃状态对吧?呃,当然我们除了更改任务以外呢,暂停任务以外呢。我们还需要有一个什么呢?我们还需要有一个API,我们直接把它拷贝过来,因为它基本上是差不多的,对吧,还需要有一个是重启任务。对吧,还需要有一个是重启任务,呃,所以说呢,我这个名字呢,我要给它起成一个resume job对吧?呃,当然这里边代码的话呢,我们就直接把它改成,实际上就是这需要改一下,那就是我们把它的任务状态呢,改成运行中,对吧?当然你呃觉得说实在我同样代码,呃只有这儿不一样,然后我还写了两份,你觉得这个嗯比较呃不符合抽象的原则的话呢,呃,那你可以就是说自己来改一下这个代码,对吧,你可以把它抽象成一个方法啊,这都是没有问题的,对吧?这都是没有问题的啊。
20:25
然后接下来的话呢,我们还需要。一个方法,那这个方法用来干嘛呢?这个方法用来删除任务对吧,用来这个删除任务好,那我们后面这个注射呢,我们就给它删掉了。啊,那么这个删除任务的话呢,我给它起一个名字叫做delete job吧,好叫做delete job,然后呢,我们的连接这些都没有问题,当然在这的话呢,我需要呃,重新编写一下这些语句,对吧,我需要重新编写一下这些语句,呃,那我们这儿的话呢,是一个delete statement等于。
21:05
呃,等于什么呢?等于一个点prepare statement对吧,然后呢,它是一个delete from。Schedule job info where ID等于问号对吧?我们直接根据ID来删除就OK了啊,当然这个ID的话呢,它就是job info.get ID好执行一下,那这个就删除完了,然后呢,不要忘记把这个语句给它关闭掉,好,那这样的话呢,我们的所有的服务也就是针对买CQ的这样的一个增删查改呢,呃,我们就都已经写完了对吧?那么接下来的话呢,我们要写什么呢?接下来的话呢,我们就要正式开始写一些定时任务了,实际上只有一个定时任务,那就是监控买CQL里边某张表的某一个字段的空值率对吧?呃,你这样的话,你可以听到它其实非常简单的,因为我们就监控一个指标,写这样的一个任务对吧?呃,那你有了这样一个任务的基础的话,你就可以发挥自己的想象啊,比方说监控一下。
22:15
这个字段的呃波动率啊,或者说监控一下这个字段,呃它的日活有没有,比方说昨天1000万,今天一下变成1亿了,对吧,那这可能是嗯,就是说有爬虫呀,或者说有DDS,呃攻击啊,DDOS攻击等等等等DDOS攻击这样的东西,对吧?呃呃,所以说你就可以发挥你的想象,因为公司里面的业务呢,他是无穷无尽的,对吧,你也并不知道说呃,产品经理或者运营他某一天他又想呃去。做一个什么样的任务对吧。
我来说两句