MyCat-1.3.0.2 源码分析2-解析rule.xml文件

程序开始启动,启动类org.opencloudb.Mycat  Startup

export CLASSPATH=/root/mycat:/root/mycat/*:$CLASSPATH

 

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 -Xms2048m -Xmx2048m -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/druid-1.0.12.jar:lib/libwrapper-linux-ppc-64.so:lib/guava-18.0.jar:lib/log4j-1.2.17.jar:lib/mapdb-0.9.8.jar:lib/wrapper.jar:lib/fdb-sql-parser-1.5.0.jar:lib/libwrapper-linux-x86-64.so:lib/Mycat-server-1.3.0.3-release.jar:lib/libwrapper-linux-x86-32.so:lib/slf4j-log4j12-1.7.3.jar:lib/ehcache-core-2.6.6.jar:lib/slf4j-api-1.7.3.jar:lib/mongo-java-driver-2.11.4.jar -Dwrapper.key=6LoiSc51snB3DbXi -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2407 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp org.opencloudb.MycatStartup start 

 

jdb -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 -Xms2048m -Xmx2048m -Djava.library.path=lib  -Dwrapper.key=6LoiSc51snB3DbXi -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2407 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.opencloudb.MycatStartup start

 

stop in org.opencloudb.MycatStartup.main

 

run 

---------如下:

刚开始代码倒没啥可说的,后面会加载rule.dtd文件和rule.xml文件。

MyCat-1.3.0.2 源码分析2-解析rule.xml文件_第1张图片

 继续跟踪

dtd = XMLRuleLoader.class.getResourceAsStream(dtdFile);

xml = XMLRuleLoader.class.getResourceAsStream(xmlFile);

Element root = ConfigUtil.getDocument(dtdxml).getDocumentElement();//获取文件的根元素

获取根元素之后,会先解析function元素。代码如下:

 

private void loadFunctions(Element rootthrows ClassNotFoundException,

InstantiationException, IllegalAccessException,

InvocationTargetException {

NodeList list = root.getElementsByTagName("function");

for (int i = 0, n = list.getLength(); i < n; ++i) {

Node node = list.item(i);

if (node instanceof Element) {

Element e = (Element) node;

String name = e.getAttribute("name");

if (functions.containsKey(name)) {

throw new ConfigException("rule function " + name

" duplicated!");

}

String clazz = e.getAttribute("class");

AbstractPartitionAlgorithm function = createFunction(nameclazz);

ParameterMapping.mapping(function, ConfigUtil.loadElements(e));

function.init();

functions.put(namefunction);

}

}

}

可以看到,获取 name,clazz两个参数之后,是通过createFunction函数来创建一个对象。

 

ParameterMapping.mapping(function, ConfigUtil.loadElements(e));则是通过反射来将配置文件的属性设置到此对象里去

所以取名为ParameterMapping

 

function.init();---之前已经初始化了function对象和属性,执行一个init初始化操作。

然后存到functions里。

---------------接下来就是解析

loadTableRules(root); 解析规则

举例子如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<mycatrules>
 
  <tableRule name="sharding-by-murmur">
      <rule>
        <columns>id</columns>列名
        <algorithm>murmur</algorithm>是下面的算法的名称
      </rule>
   </tableRule>
  
   <function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
      <property name="seed">0</property>
      <property name="count">2</property>
      <property name="virtualBucketTimes">160</property>     
     
                  
      <!--<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>    -->               
  </function>

 其实也就是说:<tableRule里面的算法需要在function里提前存在,否则会报错。

==============

 

</mycatrules>

 

 

 

 

你可能感兴趣的:(Mycat)