孙经坤
摘要:Jedi是一款自主研发产品。既满足常规EDI需求,又致力于个性化需求的解决,实现高度灵活、复用的EDI应用需求。Jedi通过直接切入各类信息系统数据源头,采集清洗所需数据,以工业产品流水化的方式实现数据元归类,通过mapping方式形成标准化的可申报报文用于口岸数据流转。Jedi典型应用于海关新舱单系统、南京海关物流监控系统,服务于口岸大通关。
关键词:EDI;Jedi;Mapping;Key-value;viewHashtable;港口;报文
中图分类号:F74文献标识码:A文章编号:16723198(2015)26005902
1引言
EDI是一种先进的计算机通讯与数据处理技术,其英文释义为Electronic Data Interchange,中文释义为电子数据交换。最初是由美国企业应用在企业间订货业务活动中,其后它应用范围逐步扩展到国际贸易、海关、交通运输、政府和公共事业中。而国内EDI兴起于海港应用,上世纪八十年代末交通部开始制定国家级物流信息标准,并迅速应用于全国各大港口及国有大型物流企业,尤其在国际性船公司、码头、海关之间应用频繁。
通俗地讲EDI就是为了实现业务目标在两个或两个以上的组织之间,在它们的信息系统之间进行自动交换预定义和结构化的数据。经过多年发展全球各大海港口岸、大型海运企业都已建立自己全球性EDI平台,平台所使用技术产品单一,集中于IBM、AXWAY等技术巨头公司。这样带来的问题是对于区域内港口物流单位,都需适应大型公司、海关、国检数据标准要求,而如何采集众多中小企业数据,如何减少众多中小系统改造成本,如何实现港口信息应用集成等这些技术实现问题,将通过本文中自主产品Jedi予以解决。
2Jedi应用场景
Jedi提供应用集成中间件、应用集成服务产品,适用于主流Java、C#二次开发,通过嵌入或复用的方式提供给信息企业或平台,采用配置MAPPING的方式实现数据采集、加工形成所需数据格式报文,完成海关、国检及各类企业级数据申报与交互。应用企业通过Jedi,建立属于自己高度灵活的EDI平台,低成本、高效率实现与其它EDI平台对接,并具有优于大型EDI平台的个性开发应用优势。
3Jedi关键技术
3.1HASH散列算法存储数据元
数据元存储结构如图1。
图1数据元存储结构如图1所示,每个待处理报文通过一个basicEdiMessage hashtable进行存储,对应多组并行的key-value值,每个value值再存储一组hashtable,以此类推。这样形成层级结构基于key-value存储的数据结构,且通过Key值能快速查找value值。既可以保证数据存储的完整性,又可以快速查找,类似于列式数据库的存储结构。
3.2Mapping方式解析报文
图2读取解析规则库报文解析第一步,读取解析规则库。
规则库为客户自主定义、开发的一类文件,称为MainRule。MainRule的存在是为了满足客户二次开发需要,且易于读写的Jedi专用中间文件。Jedi执行时,先读取MainRule,并保存至图1的数据结构中,各类报文类型生成不同的MainRule中间文件,随着客户业务的增加随时创建,并可在任意时间点更改,在文件的生成方式上,可通过图形化配置自动生成,实际上类似于Jedi的自主开发编辑器,易于用户理解与维护。
图3存储规则库报文解析第二步,存储规则库MainRule。
MainRule存储同样采用Key-Value的方式,其中Key值为msgclass+tag+snumber(报文类型+报文记录+数据元位置),以00:COSTCO::LYGEDI:CIQ为例,msgclass=COSTCO,tag=00,snumber为4则值为LYGEDI。每个数据元的长度、是否为必填或选填、循环层次等内容存储在属性值的length/MC/pre-tag中。上述内容为报文结构定义的基本内容,由客户定义输入,为下一步Jedi内核解析提供基础信息。
图4报文解析与数据读取示意图报文解析第三步,报文解析与数据读取。
报文解析命令为Map.msgcheck(“c:\\temp\\1.txt”),通过msgcheck方法输入待解析报文路径。报文数据读取命令为map.getVhm().getFromEname(“2”,ifcsum.getBlno()),上述意思为读取报文中提单号内容,该方式为遍历读取,同时读取方式也提供通过key值直接获取,如map.getVhm().getBasicHashMap().getBlnoMap().get(va.getAUnique()+"@@"+vb.getBUnique()).getCodeLoadPort(),即直接读取某个船名航次某个提单号下的装货港代码数据项。
3.3创建报文
报文创建示意图如图5。首先同样需要加载MainRule中间文件,之后加载报文数据元,数据元采用循环赋值的方式,一般生成方法为首先获取Table数据源,然后根据每个数据元的次序依次赋值,最后加载方法如下:图5报文创建示意图basicHashMap.setVesselMap(basicEdiA);
basicHashMap.setBlnoMap(basicEdiA,basicEdiB);
basicHashMap.setCargoMap(basicEdiA,basicEdiB,basicEdiC);
basicHashMap.setCtnnoMap(basicEdiA,basicEdiB,basicEdiC,basicEdiD);
形成basicHashMap后,设置报文生成路径、文件名后生成所需要的报文文件,实现方法如下:
autoBuild b=new autoBuild();
b.setBasicHashMapForRule(basicMainRuleAutoBuild.getBasicHashMap());
b.setMsgtype("NCREL");
b.setBasicHashMap(basicHashMap);
b.setDir("c:\\TEMP\\");
b.setMsgfilename("ncrel.txt");
b.setNeedFile(false);
b.BulidMessage();
4Jedi應用效应
Jedi产品,适用于小型edi平台或者企业级应用的edi中心,尤其适合于需求变化快,自主开发要求高的应用场景,该产品投入低、上手快,且无需购买国外昂贵的edi处理软件,能够快速搭建适合于自己的edi平台。同时该产品提供中间件开发模块,可自由嵌入到自己生产系统中,支持Java、c#主要开发语言。
5Jedi发展
Jedi产品目前主要完成内核功能开发,实现主要算法的研究与功能应用。后续将在外围使用功能上进一步增强,如客户端应用、日志管理、支持更多报文类型等方面。
参考文献
[1]Bruce Eckel. Thinking in Java[M].Upper Saddle River,New Jersey,USA:Prentice Hall,2006.
[2]BruceEckel.Java编程思想[M].北京:机械工业出版社,2003.