- 摘要:很好,到目前为止,一切都很顺利!下面分析ExecutorManager的初始化过程======================================================================publicclassJdbcExecutorLoaderextendsAbstractJdbcLoaderimplementsExecutorLoader{小的就不说了,主要是看AbstractJdbcLoader,有个成员publicAbstractJd
很好,到目前为止,一切都很顺利!
下面分析ExecutorManager的初始化过程
======================================================================
publicclassJdbcExecutorLoader extendsAbstractJdbcLoader implements
ExecutorLoader {
小的就不说了,主要是看AbstractJdbcLoader ,有个成员
publicAbstractJdbcLoader(Props props) {
dataSource= DataSourceUtils.getDataSource(props);
}
其实是生成了一个MysqlBasicDataSource
publicstaticAzkabanDataSource getDataSource(Props props) {//看到这里了
String databaseType= props.getString("database.type");
AzkabanDataSource dataSource= null;
if(databaseType.equals("mysql")) {//一般都是mysql
intport= props.getInt("mysql.port");//下面都是获取参数
String host= props.getString("mysql.host");
String database= props.getString("mysql.database");
String user= props.getString("mysql.user");
String password= props.getString("mysql.password");
intnumConnections= props.getInt("mysql.numconnections");
dataSource=
getMySQLDataSource(host, port, database, user, password,
numConnections);
} elseif(databaseType.equals("h2")) {
String path= props.getString("h2.path");
dataSource= getH2DataSource(path);
}
returndataSource;
}
---
/**
* Create a MySQL DataSource
*
* @paramhost
* @paramport
* @paramdbName
* @paramuser
* @parampassword
* @paramnumConnections
* @return
*/
publicstaticAzkabanDataSource getMySQLDataSource(String host, Integer port,
String dbName, String user, String password, Integer numConnections) {
returnnewMySQLBasicDataSource(host, port, dbName, user, password,
numConnections);
}
所以,前面都是取属性,然后生成MySQLBasicDataSource
====================================================
关注下这个类的结构
publicstaticclassMySQLBasicDataSource extendsAzkabanDataSource {
publicabstractclassAzkabanDataSource extendsBasicDataSource {
所以说,最终还是用了dbcp的连接池,到这里,读者对这个类大概也就知道怎么回事了,
其它细节其实都不用关心。
最后要强调的是:在
publicstaticclassMySQLBasicDataSource extendsAzkabanDataSource {
privatestaticMonitorThread monitorThread= null;//有一个监听线程
代码如下:
privateclassMonitorThread extendsThread {
privatestaticfinallongMONITOR_THREAD_WAIT_INTERVAL_MS= 30 * 1000;
privatebooleanshutdown= false;
MySQLBasicDataSource dataSource;
publicMonitorThread(MySQLBasicDataSource mysqlSource) {
this.setName("MySQL-DB-Monitor-Thread");
dataSource= mysqlSource;
}
@SuppressWarnings("unused")
publicvoidshutdown() {
shutdown= true;
this.interrupt();
}
publicvoidrun() {
while(!shutdown) {
synchronized(this) {
try{
pingDB();
wait(MONITOR_THREAD_WAIT_INTERVAL_MS);
} catch(InterruptedException e) {
logger.info("Interrupted. Probably to shut down.");
}
}
}
}
privatevoidpingDB() {
Connection connection= null;
try{
connection= dataSource.getConnection();
PreparedStatement query= connection.prepareStatement("SELECT 1");
query.execute();
} catch(SQLException e) {
// TODOAuto-generated catch block
e.printStackTrace();
logger
.error("MySQL connection test failed. Please check MySQL connection health!");
} finally{
DbUtils.closeQuietly(connection);
}
}
}
}
有兴趣的可以研究下具体做啥的 :)
那么到了这里, JDBC方面就初始化好了。
真正的execManager的初始化就不说了,读者可以自己研究下 :)
Azkaban的Web Server源码探究系列7: ExecutorManager的初始化
最新推荐文章于 2021-09-06 15:55:17 发布