当 Archiver Appliance 开始运行后发生了什么:
mgmt服务:
config\DefaultConfigService.java
initialize() {
this.mgmtRuntime = new MgmtRuntimeState(this);
startupExecutor = Executors.newScheduledThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("Startup executor");
return t;
}
});
MgmtPostStartup mgmtPostStartup = new MgmtPostStartup(this);
ScheduledFuture<?> postStartupFuture = startupExecutor.scheduleAtFixedRate(mgmtPostStartup, 10, 20, TimeUnit.SECONDS);
mgmtPostStartup.setCancellingFuture(postStartupFuture);
}
创建 mgmt 状态机 —— MgmtRuntimeState;
定期执行 mgmt 后处理 —— MgmtPostStartup。
mgmt\MgmtPostStartup.java
public MgmtPostStartup(ConfigService configService) {
this.configService = configService;
}
@Override
public void run() {
if(this.configService.isStartupComplete()) {
this.checkIfAllComponentsHaveStartedUp();
if(this.configService.getMgmtRuntimeState().haveChildComponentsStartedUp()) {
cancellingFuture.cancel(false);
}
} else {
configService.postStartup();
}
}
checkIfAllComponentsHaveStartedUp() {
if(retrievalStartupState == ConfigService.STARTUP_SEQUENCE.STARTUP_COMPLETE) {
configService.getMgmtRuntimeState().componentStartedUp(WAR_FILE.RETRIEVAL);
}
... // etl 和 engine
}
定期执行的 mgmt 后处理包括:
若 configService 未完成,则执行 configService.postStartup() ;
若 configService 已完成,检查 mgmt、engine、etl、retrieval 四个服务是否都启动成功;
每个服务启动成功时,都会更新 mgmt 状态机中已启动服务列表;
若四个服务都成功启动,则开始存储 PV 值 —— startArchivePVRequests()。
config\DefaultConfigService.java
/*
* config\DefaultConfigService.java
*/
postStartup() {
Config config = new XmlConfigBuilder().build();
...
hzinstance = Hazelcast.newHazelcastInstance(config); // 建立集群信息
pubSub = hzinstance.getTopic("pubSub");
initializePersistenceLayer(); // 初始化 MySQL 数据库中存储的 PV 信息
loadTypeInfosFromPersistence();
loadAliasesFromPersistence();
loadArchiveRequestsFromPersistence();
loadExternalServersFromPersistence();
registerForNewExternalServers(hzinstance.getMap("channelArchiverDataServers"));
eventBus.register(this); // 事务通知
pubSub.addMessageListener(new MessageListener<PubSubEvent>() {
@Override
public void onMessage(Message<PubSubEvent> pubSubEventMsg) {
PubSubEvent pubSubEvent = pubSubEventMsg.getMessageObject();
if(pubSubEvent.getDestination().equals("ALL")
|| (pubSubEvent.getDestination().startsWith(myIdentity) && pubSubEvent.getDestination().endsWith(DefaultConfigService.this.warFile.toString()))
) {
pubSubEvent.markSourceAsCluster();
eventBus.post(pubSubEvent);
}
});
this.startupState = STARTUP_SEQUENCE.STARTUP_COMPLETE;
}
将数据库中存储的 PV 信息加载到当前环境;
建立集群信息、事务通知机制:
集群中某个appliance发送消息后,先通过 PubSubEvent 推送到集群,该消息的目的appliance收到并发现是发给自己的某个服务的消息后,再通过 eventBus 推送到本地。
initializePersistenceLayer() throws ConfigException {
persistanceLayer = new MySQLPersistence(); // 与 MySQL 交互的接口
}
mgmt\MgmtRuntimeState.java
private static int threadNumber = 1;
ScheduledExecutorService archivePVWorkflow = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread