在之前的文章中,给大家介绍了通过邮件通知的方式监控业务数据文件成功通过EDI系统发送给交易伙伴,本文将给大家介绍第二种方式:通过数据库状态回写来实现。
数据库状态回写较邮件通知方案使用的场景比较有限,主要在中间数据库方案中使用。
实现原理
在创建数据库表时,除了业务字段我们还需要设置一个Status字段,用来记录数据的处理状态,通常数据库中新写入的数据Status = New,EDI系统读取后(即数据库端口获取数据后)将其更新为 Status = EDI-Received,EDI系统成功发送给交易伙伴后状态回写将其更新为Status = EDI-Sent。
实现步骤
1.根据规范整理的Mapping表创建数据库表(PO_TEST),设置Status列
注意:如果一个业务报文设置了多张表,Status字段设置在主表中
2.在知行之桥EDI系统中创建一个数据库端口,并配置连接中间数据库,用来从数据库获取PO_TEST表的数据
驱动名称:选择中间数据库对应的驱动名称,示例中使用SQL Server数据库
驱动类:默认
配置格式:默认使用属性列表
Authentication:连接数据库验证方式,根据中间数据库设置的验证方式进行选择,示例中默认使用SQL Server 验证
Server:中间数据库服务器Host信息
用户名:登录数据库的用户名
密码:登录密码
Database:连接的数据库名称
以上信息都配置后,点击测试连接按钮,进行连接测试,确认连接成功。
设置从数据库获取的数据库表(PO_TEST)、过滤规则(Status=New)、设置处理成功后的状态更新(Status=EDI-Received),参考下图:
3.在数据库端口后创建一个Script端口,通过写脚本获取数据库表信息及数据的主键ID信息,放在文件处理过程中的消息内容(Message Header)上,以便使用
脚本参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<arc:set attr="xml.uri" value="[filepath]" /> <!-- 文件路径,作为下面读取文件的入参 --> <arc:set attr="xml.xpath" value="/Items/\[1\]" /> <!-- 文件读取结构,作为下面读取文件的入参 --> <arc:if exp="[filename | startswith('PO_TEST')]"> <!-- 数据库端口获取的文件名是以数据库表名命名的,判断文件名对文件进行分类 --> <arc:set attr="out.header:tableName" value="PO_TEST" /> <!-- 输出数据库表名 --> <arc:call op="xmlDOMSearch" in="xml"> <!-- 调用知行之桥的运算器读取XML文件 --> <arc:set attr="out.header:tableid" value="[xpath('ID') | def]" /> <!-- 输出数据库主键ID --> <arc:set attr="file.filename" value="PO_[xpath('PO_NO') | def]_[_ | snowflake(1,1)].xml" /> <!-- 指定文件名 --> </arc:call> </arc:if> <arc:set attr="out.filename" value="[file.filename]" /> <!-- 输出文件名 --> <arc:set attr="out.filepath" value="[filepath]" /> <!-- 输出文件路径 --> <arc:push item="out"/> <!-- 将所有输出到文件中 --> |
4.最后需要在文件传输(MFT)端口的事件页面中的发送后(After Send)中写脚本,当文件成功发送给交易伙伴后,生成回写状态的xml文件到数据库端口。以AS2端口为例:
脚本参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<arc:set attr="table.id" value=""/> <arc:set attr="table.name" value=""/> <arc:equals attr="ErrorMessage" value=""> <!-- 判断文件发送后没有报错信息时执行以下脚本 --> <arc:call op="portGetMessageInfo" in="_input" out="out"> <!-- 调用知行之桥的运算器读取文件消息内容(Message Header)信息 --> <arc:equals attr="out.name" value="tableid"> <!-- 判断消息内容(Message Header)信息中的tableid主键信息 --> <arc:set attr="table.id" value="[out.value]"/> <!-- 获取tableid主键信息 --> </arc:equals> <arc:equals attr="out.name" value="tablename"> <!-- 判断消息内容(Message Header)信息中的tablename表名信息 --> <arc:set attr="table.name" value="[out.value]"/> <!-- 获取tablename表名信息 --> </arc:equals> </arc:call> <arc:if exp="[table.id | def | trim | getlength] >0 && [table.name | def | trim | getlength] >0"> <!-- 判断tableid主键信息和tablename表名信息值都大于0 --> <arc:set attr="file.data"> <!-- 设置回写的xml文件格式,将数据存放在file.data中 --> <Items> <[table.name]> <ID>[table.id | def | trim | xmlencode]</ID> <Status>EDI-Sent</Status> </[table.name]> </Items> </arc:set> <arc:equals attr='table.name' value="PO_TEST"> <!-- 根据表名信息判断指定处理回写xml文件的数据库端口 --> <arc:set attr="portIn.portId" value="T_UpdateDB_PO" /> </arc:equals> <arc:set attr="portIn.workspaceid" value="DB" /> <!-- 指定数据处理的工作空间 --> <arc:set attr="portIn.folder" value="Send" /> <!-- 指定回写xml文件存放的目录 --> <arc:set attr="portIn.filename" value="update_[table.name | def]_[table.id | def].xml" /> <!-- 指定回写xml文件的文件名 --> <arc:set attr="portIn.messageid" value="" /> <!-- 指定回写xml文件的message id,默认给空 --> <arc:set attr="portIn.content" value="[file.data | base64encode]" /> <!-- 对回写xml文件内容进行base64编码 --> <arc:call op="portSetFiles" in="portIn" out="out1"> <!-- 调用知行之桥的运算器将回写xml文件按照上述指定的信息存放在指定的目录下 --> </arc:call> </arc:if> </arc:equals> |
5.在知行之桥创建新的数据库端口,用来配置数据回写更新状态的模板,其中数据库连接配置和上面的一致,回写更新模板参考如下:
注意:操作选择Upsert,根据ID字段更新Status字段,参考上一步输出的xml格式,只选择配置表中的ID和Status字段,输入的xml文件与设置的输入模板需要保持一致。
验证
1.将待发送的业务数据写入中间数据库,Status给值为New
2.EDI系统读取数据(数据库端口获取),并确认Status字段值更新为EDI-Received
数据库端口获取:
获取成功后数据库中状态更新,将Status列值更新为EDI-Received
3.Script端口验证获取数据库表信息及数据主键ID信息,
文件成功发送后在输出页面点击文件名,在弹出的消息内容(Message Header)下的其他消息头部查看设置的tableid和tablename
4.AS2端口发送文件成功后,验证生成的回写xml文件,并完成回写
AS2端口成功发送文件
回写xml文件内容确认
发送回写xml文件完成数据库状态更新
数据库中状态更新为EDI-Sent
参考信息
下面是完成数据库状态回写的工作流,大家可参考:
①T_DB_OutPO:数据库端口,连接数据库,获取PO_TEST表中数据;
②T_Script_Header:Script端口,写脚本获取数据库表信息及数据主键ID信息,放在文件处理过程中的消息内容(Message Header)上;
③T_AS2:AS2端口,与交易伙伴进行AS2连接,并在AfterSend下写回写脚本生成回写的xml文件;
④T_UpdateDB_PO:数据库端口,连接数据库,配置数据回写更新状态的模板完成数据回写。
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。