在运维平台中,通常作业执行失败或者想要再次执行作业的时候,会去点击 ‘触发’按钮
之后就可以看到作业被成功重新触发执行,那么触发按钮是怎么做到让作业立即出发执行的呢,接下来带你一步步探索!
点击触发按钮时,发起的http请求如图所示
由于我是通过源码启动的运维平台,所以可以很方便的进行debug调试,通过源码发现,进入的是JobOperationRestfulApi##triggerJob()
方法
接着进入triggerJob
方法,可以发现regCenter.getChildrenKeys(jobNodePath.getInstancesNodePath())
是取出当前作业下所有的实例节点,当前只有一台,就是我的本机
进入regCenter.persist
方法,发现就是设置内容TRIGGER到 zookeeper 中节点/demoSimpleSpringJob/instances/192.168.99.1@-@18552
上
为了演示效果,我除了通过运维平台点击触发立即执行任务,还通过手动修改注册中心作业信息立即执行, 在 zookeeper 客户端内执行 set /elastic-job-demo-quick-demo/demoSimpleSpringJob/instances/192.168.99.1@-@18552 TRIGGER
效果如下,当命令输入完成,应用控制台马上输出了作业工作时的日志。
Elastic-job是如何立即执行的
在Elastic-job-core源码中, 有这么一个类TriggerListenerManager
内部的start()
方法会调用作业注册中心的监听器JobTriggerStatusJobListener
去检查注册中心的数据节点,判断是否有TRIGGER
的数据操作
最后triggerJob()
方法立刻启动相关作业