首先从
doCheckUpdatesServer()
这里 开始 执行 start(),在执行 start 方法之前需要初始化 updateServerRetrier变量,
FormValidation result = updateServerRetrier.start();
在 Retrier.java 类中的 有个 start() 方法,中会执行 result = callable.call(); 这个。
这个callable 是什么呢?
看 doCheckUpdatesServer() 中怎么初始化 updateServerRetrier的。updateServerRetrier 是 Retrier<FormValidation> 类型的。
初始化是 调用的 new Retrier.Builder<>(), 这个方法需要几个参数:
public Builder(@NonNull Callable<V> callable, @NonNull BiPredicate<Integer, V> checkResult, @NonNull String action) {
this.callable = callable;
this.action = action;
this.checkResult = checkResult;
}
可以发现第一个 参数就是 callable。 继续看 doCheckUpdatesServer() 中,把 这个 this::checkUpdatesServer 作为第一个参数传入 callable了。
初始化 Retrier.Builder 后又调用了 withAttempts , withDelay, withDuringActionExceptions, withDuringActionExceptionListener 这么几个方法,
这几个方法是为了设置几个成员变量的,最后在调用 build() 完成 new Retrier<>(this);的初始化。
在 Retrier.java 类中的 有个 start() 方法 中会执行 result = callable.call(); 这个, 然后这个方法抛出了异常,被捕获到了,然后会初始化 result,这个就是 最开始FormValidation result = updateServerRetrier.start(); 这里得到的result。
result = duringActionExceptionListener.apply(currentAttempt, e); 我们看这个 result怎么生成的,是调用了duringActionExceptionListener变量的apply() 方法,
这个 duringActionExceptionListener 是什么玩意呢? 看 上面的 那个 withDuringActionExceptionListener 方法,我们发现这个 玩意是一个 java lambda 表达式,其实也就是一个匿名方法,具体就是 (attempt, e) -> FormValidation.errorWithMarkup(e.getClass().getSimpleName() + ": " + e.getLocalizedMessage()),
其实 调用 apply(currentAttempt, e) 就是调用这个 lambda表达式,也就是调用 FormValidation.errorWithMarkup() 这个方法了,可以看到 e 就是 先前抛出的 异常, 好像 currentAttempt 这个参数没有用到。
到这里 我最后返回的 result 值已经生成初始化好了。接着 Retrier.java 类中的 有个 start() 方法中有做了一些判断,最后 返回 这个 result了。
最后 通过 lastErrorCheckUpdateCenters = Messages.PluginManager_CheckUpdateServerError(result.getMessage()); 吧这个result 格式化配上本地化字符串赋值给lastErrorCheckUpdateCenters变量了。
在 src/main/resources/hudson/PluginManager/advanced.jelly 中的 check.jelly 文件中会 显示 这个 lastErrorCheckUpdateCenters 变量的值到 web 页面上。
checkUpdatesServer() 又是什么呢? 是 PluginManager.java 中的一个方法。
其实执行顺序 就是 doCheckUpdatesServer() ---> checkUpdatesServer()
checkUpdatesServer()中 for 循环所有site,其中只有一个site,URL是:https://updates.jenkins-zh.cn/update-center.json
FormValidation v = site.updateDirectlyNow();
updateDirectlyNow(DownloadService.signatureCheck);
updateData(DownloadService.loadJSON(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(),