基于XML和工作流的消息代理设计与实现
发布时间:2015-07-13 09:47
摘 要 文章提出了一种在消息的路由、转换、聚合和分拆以及消息的标识和关联中采用XML技术和工作流技术相结合的消息代理结构,并详细讨论了其技术细节和实现方案,最后给出了该消息代理在口岸电子商务平台的一个应用案例。
关键词 XML 工作流 消息代理 消息路由 聚合和分拆
1 引言
消息代理 是一种以消息为载体、以独立的第三方软件体系为消息处理平台,在数据源与目的地之间移动数据使信息处理流畅的软件技术,数据源和目的地包括已有的应用、文件、数据库、对象(如CORBA、COM)、硬拷贝输出以及Web客户端等。消息代理主要提供数据的递送、收集、过滤、聚合或分拆、翻译、映射、转换和路由等功能,屏蔽不同的软硬件平台、数据库、消息格式、通信协议,提供应用到应用之间的高效、便捷、准确的互操作能力。
基于工作流和XML的消息代理技术则是指,在消息通过相关的通信途径如FTP、HTTP、POP3等到达消息代理后,消息代理首先将它们XML化,即把平面文件、HTML文件或者数据库的原始数据等规范化成XML格式的数据。这样在随后的消息翻译和映射转换,消息的聚合和分拆,消息的标志和关联等消息代理的相关功能实现过程中可以方便的借助XML技术来完成。然后根据预定义的工作流程来协调需要一系列复杂处理过程的交易处理。
2 消息代理体系结构
通常,消息代理都是基于消息队列技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立的执行,它们只需要知道双方所在系统环境下的消息队列位置而不需要知道彼此确切的位置或在继续执行前不需要等待接收程序接收此消息等,这不仅减少了资源共享问题,也为应用间的通信提供了便利。
而消息代理则是对消息队列的一种扩展。它一般采用发布/订阅式或点到点式或二者相结合的消息交换模式,它具有以下特点:
● 提供对数据库的支持。消息代理使用数据库来存储与之相关的数据,例如持久性控制数据,从而使消息代理具有长事务处理能力。
● 提供与各种资源的接口、数据转换能力和消息处理能力,高效的实现应用之间的消息传递。
● 提供商务逻辑层开发能力。消息代理提供一种支持流管理、处理智能化开发工具,使用户可以根据需要开发出合适的工作流和商务智能构件。
● 基于消息的代理骨干,其基于API的适配器以及包装程序完全能适应在不改变已有应用的基础上适应业务逻辑和组织机构的变化。
一个典型的、基于发布/订阅和点到点模式的多引擎消息代理结构如下图所示:
图1 多引擎的消息代理体系结构
该消息代理体系结构分通信、存储、消息引擎和控制逻辑四层。最底层是通信层,支持的接口通信协议包括HTTP,FTP,SMTP,TCP/IP等,适配器/包装程序负责将通过上述协议获得的包含应用数据的消息在各种格式间进行转换,完成应用与代理的通信。
通信层的上层是存储层,该层负责应用的注册以及日志记录。对于从通信层获得的消息,通过匹配控制逻辑层创建和存储的商务策略来决定是否需要事务处理,对于需要长事务处理的消息可以存储在数据库中,反之则存储在消息队列中供消息引擎实时处理。
存储层的上层是消息引擎层,该层有两个核心功能:消息的映射转换和消息的路由。消息的映射转换负责把存储在队列或数据库中的消息通过预定义的转换程序转换成规范的XML格式,该XML格式称之为中间格式。之后再由其他转换程序转换成应用可以识别的其他格式如平面文件,EDIFACT文件等格式文件。消息路由程序接收和分发消息并基于预先定义好的消息处理流程确保转发给正确的应用。消息的路由程序通常能执行多段的路由(“基于HUB的路由”),对于一个单个的消息,可以根据消息的源、目的地、类型、格式等定义多个处理段或对象。对象可以包括消息的转换、数据的格式转换、查询数据库、记录日志和定时传送等。应用间的互通可以是一对一、一对多或多向的。
消息代理的最上层是控制逻辑层,提供基于第四代的开发语言和工具让开发者对消息的类型、消息的路由逻辑、例外处理、工作流等进行定义,并作为组件、模块或数据存储在相应库中,从而实现对数据的灵活控制。
3 消息代理系统的实现
3.1 消息的路由和可靠传输
消息的路由分为消息匹配和消息投递两个主要部分。
消息匹配是一种逻辑路由,它可以根据预先定义的逻辑规则,确定消息从哪里获取,发给谁,有些什么要求,而不用关心消息的获取和发送是如何实现的。消息代理用队列接收并存储生产者发送的消息,同时用数据库来存储生产者和消费者的一些控制信息。当消息经由XML规范化后,消息所包含的源目的地址、消息类型等信息保存为元素、属性或记录等元数据值。消息引擎根据这些元素和属性再查询匹配数据库中存储的注册信息来确定消息的去向。对于消息的消费者属于SP的情况,路由程序可以根据登记的路由表来循环递归找到消息的最终消费者或者把消息交给SP来进行进一步的分发。
消息的投递则是一种物理路由。每个应用在建立与消息代理的通信连接前都要登记自己的通信连接信息,相关参数数据将保存在数据库中。消息匹配完成后,消息引擎通过查找消息接收者的通信连接信息后,选择合理的路径,通过通信层来完成消息的投递。
消息的可靠性要求消息投递一次而且仅仅一次,消息代理在消息的处理过程中会对该消息当前处理的一个状态作一个快照,即在日志记录里保存现场,一旦消息处理失败,则可以从该现场开始继续接着处理而不必从头开始,直到消息被正确投递到正确位置。
3.2 消息的映射和转换
在消息投递之前,消息引擎要检查消息的接收者所能够接收的消息格式,如果当前消息格式不能匹配接收的格式,那么消息代理要对消息进行相关的映射和转换。
消息的映射和转换模块就是负责这种转换。消息的生产者提供的消息具有不同的格式,在经过消息引擎后将规范化成XML格式,这样有一个好处是,使消息统一化后以便于保证消息的一致性和减少转换关系,还能便于利用XML的技术来处理复杂的企业计算。
例如若消息接收者接收非XML格式的文档,转换模块负责根据转换程序来将XML格式转换成对应的格式。在消息代理内部会为每种消息格式定义一个数据结构,在进行转换的时候将按照此数据结构读入文档,如果文档不符合数据机构,那么将认为是非法文档,这可以用来校验文档的有效性。其中可以利用DTD和XML Schema两种方式来定义XML文档结构,这可以充分发挥XML技术的优势。
3.3 消息的聚合和分拆
有一种情况,当消费者同时接收到来自几个不同的生产者或同一生产者的不同消息时,消费者并不需要几个独立的消息,消息代理提供这样一种机制,将关联的消息按照某种顺序放到队列或数据库中,然后经由某种聚合算法将这几个消息聚合成消费者可以接受的消息,再路由给消费者,其示意图
图2 消息的聚合和分拆
该图中,聚合算法包括以下三个方面:消息分组、消息抽取、消息合并合合图需要A时候将按照此数据结构读入数据。消息分组决定选择哪些消息,然后将这些分组。消息抽取是将要聚合的内容从每个消息中抽取出来,以便于聚合。消息合并是将这些抽取的内容按照一定的规则进行合并成一个独立的消息实体。
同样的道理,当消费者只对消息的某一部分感兴趣,那么消息代理将从中抽取出来并进行一定的包装,然后作为一个新的消息交给消费者。
3.4 消息的关联和工作流的制定
以上讨论的都是简单的消息应用处理,当要进行复杂的消息交互的时候,消息代理必须提供一种机制,让消息引擎能将相互独立的消息进行关联,这需要为每个消息分配一个独一无二的标识,在消息代理内部将为每个消息产生一个标识号,在消息的整个生命周期内该标识是唯一的。如生产者在发送一个消息时同时订阅了该消息的回执,那么在消息进入消息代理后,消息代理为该消息分配一个唯一的标识,在经过处理、路由给消费者时,消费者将收到包含该标识的消息,消费者同时生产一个包含该标识的回执交给消息代理,消息代理根据此标识来确认该消息的去向,从而实现了消息的关联。
消息的处理都是按照一定的商务规则来进行,消息代理提供工具以便开发者可以根据实际的商业处理流程来灵活定义工作流,一个简单的通用工作流定义如:消息通过通信模块进入消息代理,消息代理首先将消息进行分类,再进行下一步的操作,包括格式转换、加密解密、校验、应用商业规则、封装、路由等,最后通过通信模块送往目的地。以上工作流模块均是以模块化形式存在,用户可以开发定制,然后注册由系统自动调用。
3.5 事务和回滚
上面的情况中,如果没有与生产者消息相匹配的消费者消息,即消费者没有响应,由于关联性,代理必须取消生产者该次的消息发布,直到消费者的回执消息到达。这就需要消息代理支持事务和回滚。例如应用A向应用B转账,当A上的账款已划出在没有收到应用B的收款确认的回复消息时,该次交易将被取消。
消息代理与数据库的结合能很好的解决这一问题。当消息引擎接收到消息后将一份拷贝持久化到数据库中,并将该过程的控制信息保存,当消息超时或者超过一定限度仍没有回应,代理将认为该次交易不成功,反之数据库中的消息将被激活。
4 在口岸电子商务平台的应用
在口岸电子商务平台上的一个典型应用某类出口企业A中货运系统需要向另外一类船公司企业B中订舱系统订舱,在得到对方订舱确认后确定出口货物事宜。企业A和企业B分别处于不同的操作系统,且数据分别由SQL Server和ORACLE两种不同的数据库管理系统管理,同时企业A在发出订舱请求后必须得到订舱确认,这就需要一个中间平台来屏蔽双方不同系统之间的差异,从而实现两者之间的商务沟通,采用上述的基于XML和工作流的消息代理系统可以方便快捷的实现,其应用场景如下图所示:
图3 消息代理在口岸商务应用场景
该应用场景采用事件驱动机制来触发整个系统,具体工作机制
(1)消息发送:企业A通过自己的货运系统制作订舱消息(如平面文件),通过FTP、HTTP等通信协议与消息代理提供的通信接口建立连接,并向消息代理提交订舱消息,该消息包括消息头和消息体两部分,消息头中携带了源目的地址、通信协议、事务标记、消息参考号等,消息体中是消息的内容,也就是具体的订舱信息。消息代理接收到企业A的订舱信息后首先从头部获得要发送的目的地址,并根据事务标记判断是否需要持久化,然后消息引擎会根据预定义的工作流来触发下一步的动作,如转换格式、转换代码等。
(2)消息接收:消息代理中的消息引擎按照工作流程处理完源消息后将产生一个中间格式的消息,此时消息引擎会从企业B的配置里面找到所定义的一些配置信息,如消息格式、通信协议、是否接收该类消息等丰富的选项,消息引擎将匹配这些规则后将消息做进一步处理成企业B可接收的目标消息,最后消息将由通信模块根据路由表的一些信息将消息送达企业B并等待对方的订舱确认信息。
(3)消息的事务处理:消息代理在接收源消息后自动产生一个消息标识以跟源消息参考号进行关联,同时将时间戳标记等一并写入数据库中,在消息处理后送达企业B时,也会将该信息连同时间戳再次写入数据库,并等待对方确认。理想情况下,企业B将会发送一个带有消息标识的订舱确认消息给消息代理,消息代理会再根据此消息标识找到对应的源消息,并将此消息回传给企业A,那么交易成功。最坏情况下,如果代理在规定时限内没得到企业B的确认或超时,代理会取消该次交易,并发送一个系统回执给企业A,告诉其事务取消及其原因,从而实现了交易的事务回滚。
5 结束语
通过引入XML技术,使得在消息代理中应用XML技术对消息进行合并、抽取以及保持事务完整性提供了可能。消息代理内部可以自定义多个工作流程来满足不同的应用需求。此外这种集中式的消息交换平台,既保持了系统间的松散耦合性,也使得系统具有很高的可扩展性,在目前的口岸电子商务应用中可以抽取丰富的商务流程,使得更多的企业可以随时动态的加入这个消息交换平台中开展电子商务活动。
参考文献
1.陈旭华,周华春.基于消息路由的综合网络管理系统[J]. 数据通信. 2003,2(2):8-10
2.
3. 魏威,曾庆济,于洪涛. 统一消息服务系统的分析与设计. 计算机工程. 2002,28(2)
上一篇:MD5算法的快速硬件实现
热门论文
- 基于XML和工作流的消息代理设计与实现
- 基于XML的网络接口设计与实现
- 基于GIS的现代物流管理系统设计与实现
- 基于iDEN专网的现代物流信息系统设计与功能实现
- 基于XML技术的自动阅卷系统设计与实现
- 基于工作流的殡葬服务管理系统设计与实现术
- 基于Struts2的信息管理系统设计与实现
- 基于VB的仓储信息管理系统设计和实现
- 基于SMQ消息中间件的军事数据交换设计与实现
- 基于AT91RM9200的BootLoader设计与实现
- 关于工作流的软件项目管理系统的设计与实现
- 基于VB和XML的个人资料编辑器的实现
- 基于B/S结构移动物流信息管理平台的设计与实现
- 基于ASP的学生信息管理系统的设计与实现
- 基于XML的雷达装备维修信息管理系统设计