在JobScheduler实例化结束后的init方法中会调用schedulerFacade的registerStartUpInfo方法完成注册作业启动信息的工作,解析来我们就来看一下它工作的具体流程
public void registerStartUpInfo(final boolean enabled) {
//启动所有的监听器
listenerManager.startAllListeners();
//选举主服务器
leaderService.electLeader();
//持久化作业服务器上线信息
serverService.persistOnline(enabled);
//持久化作业运行实例上线相关信息
instanceService.persistOnline();
//设置重新分片的标记
shardingService.setReshardingFlag();
//初始化作业监听服务
monitorService.listen();
if (!reconcileService.isRunning()) {
reconcileService.startAsync();
}
}
首先启动的监听器和选举主服务器的流程,剩余的工作就是向注册中心发送信息创建节点。
public void startAllListeners() {
electionListenerManager.start();
shardingListenerManager.start();
failoverListenerManager.start();
monitorExecutionListenerManager.start();
shutdownListenerManager.start();
triggerListenerManager.start();
rescheduleListenerManager.start();
guaranteeListenerManager.start();
jobNodeStorage.addConnectionStateListener(regCenterConnectionStateListener);
}
我们可以看到监听器的种类有如下:
1、选举主服务器
2、分片
3、job失效
4、幂等性监听
5、服务器关闭
6、作业触发
7、重新调度
8、保证分布式任务全部开始和结束状态
9、注册中心连接状态
在下一篇博客里面,会详细介绍每一种监听器,下面来看一下选取主服务器的流程
public void electLeader() {
log.debug("Elect a new leader now.");
jobNodeStorage.executeInLeader(LeaderNode.LATCH, new LeaderElectionExecutionCallback());
log.debug("Leader election completed.");
}
jobNodeStorage是用来访问zookeeper的节点的,通过它来实现主节点的选举,executeInLeader方法传入了分布式做使用的作业节点名称和一个回调函数,先来看一下这个回调函数做了些什么
class LeaderElectionExecutionCallback implements LeaderExecutionCallback {
@Override
public void execute() {
if (!hasLeader()) {
jobNodeStorage.fillEphemeralJobNode(LeaderNode.INSTANCE, JobRegistry.getInstance().getJobInstance(jobName).getJobInstanceId());
}
}
}
如果当前没有主节点,那么就像zookeeper的主节点路径下添加当前服务器的id,参与选举主节点
public void executeInLeader(final String latchNode, final LeaderExecutionCallback callback) {
try (LeaderLatch latch = new LeaderLatch(getClient(), jobNodePath.getFullPath(latchNode))) {
latch.start();
latch.await();
callback.execute();
//CHECKSTYLE:OFF
} catch (final Exception ex) {
//CHECKSTYLE:ON
handleException(ex);
}
}
获取分布式锁,如果获取到了就尝试成为主节点。简单来说就是看一台服务器是否能够成功在指定路径下创建节点来判定是否成功成为主节点。