统一对象消息编程(8)—对象消息编程框架5

        前面已经对主要的消息对象模板类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来读取。

猜你喜欢

转载自blog.csdn.net/tianlong117/article/details/81461484