前面已经对主要的消息对象模板类TLBaseModule进行了介绍,现在介绍模块配置文件。配置文件无非是对对象的属性进行初始赋值。TLBaseModule属性已做了介绍,那么配置文件中主要是对这些属性的设置。每个模块单独有自己的配置文件,文件采取xml格式文件。下面是一个模块的标准格式:
<?xml version="1.0" encoding="UTF-8" ?>
<moduleConfig>
<params>
<name value="demo"></name>
<verison value="1"></verison>
</params>
<!-- 初始运行消息表-->
<initMsg>
<msg action="setup" ></msg>
</initMsg>
<!-- 消息路由表-->
<msgTable>
<msgid value="volecity" >
<msg action="getModule" destination="moduleFactory" moduleName="volecity"/>
</msgid>
<msgid value="log" >
<msg action="getModule" destination="moduleFactory" moduleName="log"/>
</msgid>
<msgid value="usermodule" >
<msg action="getModule" destination="moduleFactory" moduleName="usermodule"/>
</msgid>
</msgTable>
<!-- 方法运行前执行消息表-->
<beforeMsgTable>
<action value="baidu" >
<msg action="startLog" destination="tllog" waitFlag="false"></msg>
<msg action="startcache" destination="cache"></msg>
</action>
<action value="*" >//所有方法
<msg action="startLog" destination="tllog" waitFlag="false"></msg>
</action>
</beforeMsgTable>
-->
<!-- 方法运行后执行消息表-->
<afterMsgTable>
<action value="baidu1" >
<msg action="startLog" destination="tllog" waitFlag="false"/>
</action>
</afterMsgTable>
</moduleConfig>
这里每一个二级目录都对应模块对象中是属性。在工厂创建模块对象是,自动填装。当然对于不需要某个属性的可以不设置。
下面一个模块的配置仅仅设置了一个初始运行消息,当初始化时,执行消息,其中acton=“sleep”’
<?xml version="1.0" encoding="UTF-8" ?>
<moduleConfig>
<params>
<name value="demo"></name>
<verison value="1"></verison>
</params>
<initMsg>
<msg action="sleep" ></msg>
</initMsg>
</moduleConfig>
通过配置文件看出,配置文件主要是各种消息的配置,如初始运行消息表initMsg、消息路由表msgTable等。通过消息的配置,可以灵活控制对象的各种行为,可以灵活装卸组织各种模块的组合。所有模块互相平等,不存在控制、依赖的关系,通过消息的传递进行互动。下面对配置项简单说明。
<initMsg>
<msg action="setup" ></msg>
</initMsg>
初始运行消息表,当对象初始化时,自动执行消息,消息action为“setup“。如果我们想在初始化时候再运行一个模块,比如模块myuser,执行action=login的消息,那么增加一条
<msg action="login" destination="myuser"></msg>
这样自动执行该消息,由于消息目的不是自己,则把消息发送给myuser模块。这时候myuser并没有启动,记得在我们前面模块分析时说过,将自动由模块工厂装配myuser。
<beforeMsgTable>与 <afterMsgTable>项为消息前后期执行的消息链表,通过配置,可以灵活的调整对象方法执行前后的行为。
配置中的waitFlag="false" 参数,说明这是一个异步消息,既建立一个线程而发送这个消息,对应TLMsg中的属性。
<params>项目自动装填对象的params属性,子项内容由对象自身定义。
对于不需要配置的模块,可以不需要配置文件。
在一些情况下,除了标准的对象属性,模块还定义了自己的属性值。比如下面这个TLWUrlMap模块配置,这是一个web框架中的url转msg模块
<?xml version="1.0" encoding="UTF-8" ?>
<moduleConfig>
<!-- 目录相对于filter配置目录下-->
<url-mapping>
<url value="/*" >
<!-- 对于目录设置*,该目录下只能为同一个servmodule处理 。
map方式: 该目录后下url=“方法” ,如/home 对应 index 方法。没有map的方法无法访问-->
<msg destination="appCenter" default="index"
bd="baidu" home="index" input="input" content="content"
getmsg="getmsg" ve="velocity" http="http" />
</url>
<url value="/baidu" >
<msg action="baidu" destination="appCenter" />
</url>
<url value="/service" >
<msg action="service" destination="msgMap" />
</url>
<url value="/index" >
<msg action="index" destination="appCenter" />
</url>
<url value="/test/*" >
<msg destination="servletTest1" getuser="user" index="index" />
</url>
<url value="/db/*" >
<msg destination="servletDbTest" find="find" findall="findall"
query="query" dbmodle="dbmodle"/>
</url>
</url-mapping>
</moduleConfig>
这个模块自定义了一个url-mapping属性,用于将url对应相关的消息。这时可定义自己的配置文件读取类,由于 url-mapping属性也是一个map表,可继承现有的配置文件类TLModuleConfig,通过标准的map表读取方法来读取。
protected class myConfig extends TLModuleConfig {
protected HashMap<String, ArrayList<TLMsg>> urlMapTable;
public myConfig() {
}
public HashMap getUrlMapTable() {
return urlMapTable;
}
protected void myConfig(XmlPullParser xpp) {
super.myConfig(xpp);
try {
if (xpp.getName().equals("url-mapping")) {
urlMapTable= getMsgTable(xpp,"url-mapping","url");
}
} catch (Throwable t) {
}
}
myConfig 是一个内部类,只供模块自身应用。
标准模块配置文件通过TLModuleConfig来读取。