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