调度中心启动时主要执行了XxlJobScheduler.init()方法,该方法中有六个初始化动作,这篇文章来分析第一个初始化动作:初始化国际化组件。其关键调用代码为:initI18n();

国际化简介

国际化又称为i18n,来源于国际化的英文单词internationalizationin之间有18个英文字母。

源码分析

我们来看一下initI18n()方法的代码:

1
2
3
4
5
private void initI18n(){
for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
}
}

循环迭代枚举com.xxl.job.core.enums.ExecutorBlockStrategyEnum,该枚举是执行器阻塞策略枚举。只有一个title属性,提供了三个枚举对象:

1
2
3
4
5
6
7
8
9
10
public enum ExecutorBlockStrategyEnum {

SERIAL_EXECUTION("Serial execution"),
/*CONCURRENT_EXECUTION("并行"),*/
DISCARD_LATER("Discard Later"),
COVER_EARLY("Cover Early");

private String title;
......
......

循环中调用变异器setTitle()方法给每个枚举对象的title属性重新赋值。

工具类I18nUtilgetString()方法获取到以jobconf_block_开头,以枚举对象名结尾的属性值。

我们来看一下工具类getString()方法的实现:

1
2
3
public static String getString(String key) {
return loadI18nProp().getProperty(key);
}

调用了静态成员方法loadI18nProp()得到一个Properties对象,再调用其getProperty()方法从资源文件中获取对应key的值。

来看一下loadI18nProp()方法的实现:

I18nUtil.loadI18nProp

  • 读取application.properties配置文件的xxl.job.i18n配置项的值;
  • build组装,得到i18n文件路径。即resources\i18n目录下的Resource Bundle 'message'资源包文件;
  • 使用Spring提供的PropertiesLoaderUtils工具类加载对应资源文件。

我们可以从这里知道调度中心application.properties的配置项xxl.job.i18n有两种配置,一是缺省不填,为中文;二是设置为en,即英文。

resources\i18n目录看下资源包文件:message.propertiesmessage_en.properties。搜索jobconf_block_,得到以下内容:

message.properties

1
2
3
4
## job conf
jobconf_block_SERIAL_EXECUTION=单机串行
jobconf_block_DISCARD_LATER=丢弃后续调度
jobconf_block_COVER_EARLY=覆盖之前调度

message_en.properties

1
2
3
4
## job conf
jobconf_block_SERIAL_EXECUTION=Serial execution
jobconf_block_DISCARD_LATER=Discard Later
jobconf_block_COVER_EARLY=Cover Early

可以发现键中jobconf_block_后接的内容即为ExecutorBlockStrategyEnum枚举的name值。一共有三个阻塞策略:单机串行、丢弃后续调度和覆盖之前调度。

initI18n()方法的迭代完成后,枚举的title属性值就变成了对应的国际化设置。

总结

这篇文章主要是分析了调度中心国际化组件的初始化原理。接下来我们将继续分析调度中心启动的其它初始化动作。