elastic job原理解析-SchedulerFacade(一)
在elastic job原理解析-Scheduler中描述elastic job的相关quartz的操作,但是并没有牵扯到对于job的管理,如分片,主节点选举等。分片,job的状态的持久化等一些列操作是有schedulerFacade和jobFacade完成。
schedulerFacade既然使用了facade模式那么必然scheduleFacde中存在大量服务需要被调用。如下图中显示facade所依赖的对象
SchedulerFacade
在jobSchedule分别在构造函数和init中对schedulerFacade完成了创建和更新。
schedulerFacade的初始化
schedulerFacade = new SchedulerFacade(regCenter, liteJobConfig.getJobName(), elasticJobListenerList);
在schedulerFacade中构造函数中对各个server进行了初始化,诸如leaderService,serverService等。这个过程中主要是将jobConf的信息传递到各个service,使其完成各个服务的创建。
schedulerFacade的job的持久化
在jobSchedule的init方法中涉及到节点的持久化,为什么到这个时候采用持久化节点,因为schedule的init的时候在调用quartz完成job的启动,所以这个job任务的选举分片也只有在这个过程中才可以处理。
LiteJobConfiguration liteJobConfigFromRegCenter = schedulerFacade.updateJobConfiguration(liteJobConfig);
public LiteJobConfiguration updateJobConfiguration(final LiteJobConfiguration liteJobConfig) {
configService.persist(liteJobConfig);
return configService.load(false);
}
上面两段代码一段是jobSchedule中init的schedulerFacade对job任务的更新,这个过程是将job持久化到zk的过程。
schedulerFacade的主节点选举
持久化结束之后,jobschedule创建quartz的job并启动quartz,启动完成quartz之后需要牵扯的一个主节点的选举和分片。
public void registerStartUpInfo(final boolean enabled) {
listenerManager.startAllListeners();
leaderService.electLeader();
serverService.persistOnline(enabled);
instanceService.persistOnline();
shardingService.setReshardingFlag();
monitorService.listen();
if (!reconcileService.isRunning()) {
reconcileService.startAsync();
}
}
elasticJob过程中主节点选举过程比较简单,仅仅是zk节点的抢占,并没牵扯其他
public void executeInLeader(final String latchNode, final LeaderExecutionCallback callback) {
try (LeaderLatch latch = new LeaderLatch(getClient(), jobNodePath.getFullPath(latchNode))) {
latch.start();
latch.await();
callback.execute();
} catch (final Exception ex) {
handleException(ex);
}
}
抢占之后主节点内容如下192.168.0.109@-@767。
facade里面包含服务比较多,会分成多个篇幅依次写出。