小飞,还记得抽取程序,呵呵,的确是很老的代码了,我已经找不到数据库的设置了,那是写死的东西,这次我自己要用一个,所以更新了一下,呵呵,没有流程信息,没时间弄了,但是基础的功能有了,不知道拿来做什么,哈哈

 

1、系统需求
运行程序需要 JDK1.5以上版本。
以下文档默认系统已经安装了JDK并且已经设置JAVA_HOME指向JDK1.5的安装目录。

2、介质
发布是按照Jar文件直接发布,系统发布的时候发布两个文件
        jeasonzhao.flow.jar 主程序文件,包含第三方的Jar包
        bank.transfer.xml 抽取配置文件
提示:在实际环境中,当抽取信息配置固定之后,建议将 bank.transfer.xml 直接压到Jar包中,这样防止不必要的错误操作,具体操作为:用Winrar打开jeasonzhao.flow.jar,拖拽bank.transfer.xml到Jar文件中的顶层目录(和com、lib以及versionHistory.txt平级)。系统加载的时候读取配置文件会以JAR包中的文件优先,例如在Jar包中已经保存了一个bank.transfer.xml,而且在当前目录下也有bank.transfer.xml的情况下,Jar包中的文件bank.transfer.xml会被使用,而当前目录下的文件会置之不理。

3、配置
配置文件 bank.transfer.xml 包含了所有的配置项信息,包括常量定义,数据库连接信息等等。

3.1 总体配置结构
<bankServer>                     | 顶层节点
    <resources>                  | 资源节点,目前只保存了数据库信息
        <database/>              | 3.2 数据库配置节点,按照ID将数据库配置保存在统一的地方,方便重复使用
    </resources>                 |
    <var/>                       | 3.3 变量定义,例如银行代码
    <group>                      | 3.4 任务分组
        <action/>                |    具体的任务定义
    </group>                     |
</bankServer>                    |
以下逐项对配置进行解释
3.2 数据库配置
数据库配置的节点例子为
<database id="Bank.source" dbms="SQLServer"
    server="127.0.0.1" database="Bank" user="sa" password="123456" />
属性列表如下
    id        : 数据库标识符,随便什么名字都可以,只是为了重复使用同一份数据库配置
    dbms      : 数据库类型,目前为SQLServer
    server    : 数据库所在的主机名称或者IP地址
    database  : 数据库名字,例如DeclareSystem或者Bank
    user      : 数据库用户名
    password  : 数据库用户密码
数据库配置信息中Server和Database是和实际的DBMS值相关,例如在DBMS的值为Sqlite的时候,系统使用Sqlite数据库,则没有Sevrer和Database两个参数,取而代之的是FileName参数,例如:
<database id="TestSqlite" dbms="Sqlite" fileName="c:/test.db" />
因为目前使用的数据库是SQLServer,所以此处不做过多的说明。

3.3 变量定义
系统支持表达式的使用,表达式则需要变量,例如下面的定义
path="='BOP'+'F'+BANKNO+substring(XMLDATE,2)+'01.XML'"
这个定义中,Path的值
='BOP'+'F'+BANKNO+substring(XMLDATE,2)+'01.XML'
第一个字符“=”表明这是一个表达式,这个实际的表达式解析为:
      字符串"BOP"
    + 字符串"F"
    + 变量 BANKNO
    + 函数 substring,两个参数,第一个参数为:变量XMLDATE,第二个参数为常数2
    + 字符串 "01.XML"
上面的表达式中存在两个变量 BankNo和XMLDate,变量不区分大小写。
定义变量的XML例子如下
<var name="BANKNO" value="指定银行代码" />
属性列表如下
    name  : 变量名称
    value : 变量的值,这里不能使用表达式
注意:系统自身支持两个内置的变量,在定义变量的时候请不要定义同名的变量,他们是:
    EXTRACTDATE :从银行系统中抽取的交易日期,默认为当前日期的前一天
    XMLDATE     : 抽出数据成为上报所需的XML的日期,默认为当前日期的前两天
在实际运行环境中,请修改变量BANKNO的值为实际的银行12位编码

3.4 任务定义
任务拆分成任务组,任务组下挂实际的任务,当前有两个任务组:
    1、从银行系统中抽取数据的任务组
    2、从申报系统中抽取生成XML的任务组
任务组的定义为
<group name="基础数据抽取">...</group>
只有一个属性,name,表明任务组的名称。以下针对两个任务组的实际Action配置进行详述。

3.4.1 抽取Action
抽取Action的主要职能是从指定的源数据库中执行指定SQL,并将结果传给目标数据库并执行指定SQL将数据导入到目标数据库的操作。XML配置实例为
<action                                |
    name="Name of Action"              | 名称,显示当前在做什么
    type="DatabaseTransfer">           | 类型,操作类型不能变更,必须是DatabaseTransfer
    <src                               | 源数据库配置
        database="Bank.source">        | 数据库标识符,根据这个标识符从资源中的数据库配置中找到实际的配置
        <onenter>.[SQL1].</onenter>    | 开始处理数据源的时候执行的预处理SQL语句
        <sql>.[SQL2].</sql>            | 正式抽取源数据的SQL语句
    </src>                             |
    <destination                       |
        database="Bank.destination">   | 数据库标示
        <onenter>.[SQL3].</onenter>    | 开始处理目标数据的时候执行的预处理SQL语句
        <sql>.[SQL4].</sql>            | 实际插入的SQL语句
    </destination>                     |
</action>                              |
如上所示,在配置中最多可能有四组SQL语句,SQL1,SQL2,SQL3和SQL4,这四组SQL语句的执行顺序为
    1、在源数据库中执行SQL1
    2、在源数据库中执行SQL2,并取得返回的结果集ResultSet
    3、在目标数据库中执行SQL3
    4、枚举ResultSet,针对每一条源数据行,执行SQL4
SQL语句组支持多个SQL叠加执行,多个SQL之间使用分号分割。例如
<onenter>
    delete from taba where aid=@aid; --行注释,删除第一个表的指定字段,参数为@aid
    delete from tabb where bid=@bid; /*块注释,删除第二个表的数据,参数为@bid*/
</onenter>
SQL语句支持行注释和块注释,如上例。
SQL语句中的参数定义使用@加参数名的方式定义,例如上例中的@aid和@bid两个参数。这表明具体的值是需要在运行的时候根据上下文确定,参数值的取得原则如下:
    1、如果上下文中存在结果集,例如SQL4执行的时候,则根据参数名称取得结果集中的对应列的信息
    2、如果上下文中存在流程信息,则从流程信息取得(目前没有)
    3、从公共设置的参数中取得,目前已经有的参数为EXTRACTDATE/XMLDATE和BANKNO.
所以,在编写导入的时候比较方便,例如两个表格Src和Dest定义如下
create Table Src     >|      create Table Dest
(                    >|      (
    SrcId ...,       >|         DestId ...,
    SrcName ...,     >|         DestName ...,
    SrcDesc ...      >|         DestDesc ...
)                    >|      )
配置抽取的SQL语句为
select * from src
配置导入的SQL语句为(注意参数名称)
insert into Dest(DestId,DestName,DestDesc)
values
(@SrcId,@SrcName,@SrcDesc);

3.4.2 XML抽取Action
XML抽取动作是将指定数据库中的符合条件的数据,按照SQL的列信息组合成相应的XML文件,并生成上报所需要的控制文件。
<action                                     |
    name="RE"                               | 显示名称
    type="BankXMLGenerator" >               | 类型,操作类型不能变更,必须是BankXMLGenerator
    <path value="c:/"/>                     | 输出文件存放的位置
    <controlfile                            |
    value="FileName" />                     | 控制文件文件名
    <file                                   |
        name="Desc"                         | 抽取的文件的描述,例如外汇收入
        path="FileName"                     | 抽取的文件的文件名
        database="Bank.destination">        | 从哪个数据库中抽取
        <sql>...</sql>                      | 抽取的 SQL语句
    </file>                                 |
</action>                                   |
抽取Action的执行步骤为
    1、开始执行任务,检查并建立输出文件夹
    2、执行每一个抽取的文件,记录文件名和状态
    3、根据抽取的文件数量生成控制文件
抽取生成XML的规则非常直观,例如SQL语句
select AField,BField from Tab
则生成的XML样式为 (注意Records中的节点名称)
<MSG>
    ...
    <TOTALRECORDS>10</TOTALRECORDS>
    <RECORDS>
        <REC>
            <AField>a1</AField><BField>b1</BField>
        </REC>
        <REC>
            <AField>a2</AField><BField>b3</BField>
        </REC>
        <REC>
            <AField>a2</AField><BField>b3</BField>
        </REC>
        ...
    </RECORDS>
</MSG>

4、运行
程序是一个命令行程序,使用
%JAVA_HOME%/bin/java -jar jeasonzhao.flow.jar
开始运行程序。
%JAVA_HOME%/bin/java -jar jeasonzhao.flow.jar -h
打开帮助信息,如下:
|SystemInfo| ----------------------------------------------------
|SystemInfo| 帮助信息
|SystemInfo| 配置文件在 bank.transfer.xml
|SystemInfo| 参数信息
|SystemInfo|         -group [组名] 只执行某组的所有任务,不输入这个参数为全部执行
|SystemInfo|         -action [组名.任务名] 只执行某组的指定任务
|SystemInfo|         -date [时间] 时间格式,YYYYMMDD,例如20090512,配置抽取哪天的数据
|SystemInfo|         示例:-group 测试组名 -date 2009-05-01
|SystemInfo|         示例:-action 测试组名.实际任务 -date 2009-05-01
|SystemInfo|         -daemon [时间] 不间断运行,每天指定时间执行所有任务,抽取时间按照默认参数设置,设置这个参数之后,其他参数无效
|SystemInfo|         示例:-daemon "2009-12-12 08:00:00"
|SystemInfo| ----------------------------------------------------

默认情况下,没有任何参数运行程序会自动执行所有的定义的任务,在我们的实际环境中即是:
    1、执行抽取昨天的所有基础数据。
    2、生成前天的所有XML上报文件。
参数Group指定具体执行那个组,例如
%JAVA_HOME%/bin/java -jar jeasonzhao.flow.jar -group 基础数据抽取
表明只执行基础数据抽取组抽取基础数据

参数-date指定抽取的时间(包括XML生成和基础数据抽取),这个参数可以和group以及Action联合使用,例如
%JAVA_HOME%/bin/java -jar jeasonzhao.flow.jar -group 基础数据抽取 -date 20090501
%JAVA_HOME%/bin/java -jar jeasonzhao.flow.jar -action 基础数据抽取.境外付款承兑通知书 -date 20090502
上面实例中,第一个是抽取 2009年05月1日的所有基础数据到我们的数据库中,第二个是只抽取2009年5月2日的境外付款承兑通知书到我们的数据库中。

参数-daemon只有一个参数,指定什么时候自动执行任务,运行之后系统每5分钟会提醒什么时候执行下一次抽取。

日志文件在当前路径的log/BankServer******.log文件。


Jeason Zhao (沈胜衣,斛律光) ------雪饮再现,一个人的江湖
我知道我是谁,我是沈胜衣,默默的活着,就像空气。