通过mycat来学习java了^^。
mycat的启动这样的:./mycat start
执行这个命令后,我们看一下mycat的命令:
$ ps -ef | grep mycat
mycat 21348 1 0 Nov28 ? 00:03:25 /home/mycat/mycat/bin/./wrapper-linux-x86-64 /home/mycat/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/home/mycat/mycat/logs/mycat.pid wrapper.daemonize=TRUE
mycat 21350 21348 0 Nov28 ? 00:25:37 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/mysql-binlog-connector-java-0.4.1.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar:lib/Mycat-server-1.6-RELEASE.jar -Dwrapper.key=7bAB7DOGhhiX_myT -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=21348 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleAppio.mycat.MycatStartup start
由此可知io.mycat.MycatStartup就是mycat的启动类,就从这个类开始,来了解mycat,并学习里面的java知识。
先看一下MycatStartup类的代码:
public final class MycatStartup {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final Logger LOGGER = LoggerFactory.getLogger(MycatStartup.class);
public static void main(String[] args) {
// use zk ?
// 是否启用zk配置,/myid.properties中的loadZk属性决定,默认不启用,从本地xml文件中读取配置
ZkConfig.getInstance().initZk();
try {
String home = SystemConfig.getHomePath();
if (home == null) {
System.out.println(SystemConfig.SYS_HOME + " is not set.");
System.exit(-1);
}
// init
// 获取MyCat实例,其实就是读取配置文件,并验证正确性等
MycatServer server = MycatServer.getInstance();
// 获取环境变量,日志配置
server.beforeStart();
// startup
// 启动MyCat,启动线程,初始化线程池和连接池等
server.startup();
System.out.println("MyCAT Server startup successfully. see logs in logs/mycat.log");
} catch (Exception e) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
LOGGER.error(sdf.format(new Date()) + " startup error", e);
System.exit(-1);
}
}
}
这个类很简单,只有一个main函数,挑重点一行行看看。
ZkConfig.getInstance().initZk();
这一行是zookeeper的初始化,mycat没有zookeeper照样可以运行,为了简单,不偏离主题,略过这一行。
String home = SystemConfig.getHomePath();
Ctrl+左点击getHomePath()方法,阅读源码,发现就是为读取“MYCAT_HOME”这个环境变量的,这个变量是在./conf/wrapper.conf里配置,默认是-DMYCAT_HOME=.。这个变量就是指定bin、conf、logs、lib、catlet所在的目录。
这里的java知识点在于System类的getProperty()和setProperty()方法的使用:
System类里有许多环境变量,可以通过System.getProperties()来获取,例如:
java.version | Java 运行时环境版本 |
java.vendor | Java 运行时环境供应商 |
java.vendor.url | Java 供应商的 URL |
java.home | Java 安装目录 |
java.vm.specification.version | Java 虚拟机规范版本 |
java.vm.specification.vendor | Java 虚拟机规范供应商 |
java.vm.specification.name | Java 虚拟机规范名称 |
java.vm.version | Java 虚拟机实现版本 |
java.vm.vendor | Java 虚拟机实现供应商 |
java.vm.name | Java 虚拟机实现名称 |
java.specification.version | Java 运行时环境规范版本 |
java.specification.vendor | Java 运行时环境规范供应商 |
java.specification.name | Java 运行时环境规范名称 |
java.class.version | Java 类格式版本号 |
java.class.path | Java 类路径 |
java.library.path | 加载库时搜索的路径列表 |
java.io.tmpdir | 默认的临时文件路径 |
java.compiler | 要使用的 JIT 编译器的名称 |
java.ext.dirs | 一个或多个扩展目录的路径 |
os.name | 操作系统的名称 |
os.arch | 操作系统的架构 |
os.version | 操作系统的版本 |
file.separator | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | 行分隔符(在 UNIX 系统中是“/n”) |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户的当前工作目录 |
这些变量值可以通过System.getProperty()这样的命令来获取,例如:
>System.out.println(System.getProperty("java.vendor"));
Oracle Corporation
也可以通过System.setProperty()来设置自定义变量,例如:
System.setProperty("MYCAT_HOME", "/home/mycat");
也可以在运行java程序时,通过-D来指定变量,例如:
$java -DMYCAT_HOME=. io.mycat.MycatStartup