基于Java的通信中间件的设计与实现
作者:殷锋社,
来源:《现代电子技术》2010年第15
        :通过研究通信软件中常用的设计算法,收集使用面向对象技术开发通信软件时常用的设计模式,利用Java语言完成基于Java的通信中间件设计与实现,并给出了主要部分的实现。实现了全部的JMS标准API,提供了消息持久化、消息预览和消息选择功能,建立了可靠的线级通讯连接,提高了产品的服务质量。
        关键词:面向对象技术; Java通信中间件; 通信软件; 对象序列化
        中图分类号:TP31文献标识码:A
        文章编号:1004-373X(2010)15-0149-04
        Design and Implementation of JAVA-based Middleware for Communication
        YIN Feng-she,JIAO Lei
        (Shaanxi Polytechnic Institute, Xianyang 712000, China)
        Abstract: The design and implementation of JAVA-based communication middleware were achieved with JAVA language by studying the common design algorithms of communication softwares and collecting the design patterns of using the object- oriented  technology to develop communication software. All the JMS APIs were implemented. The reliable wire-level communication was established. The implementation process of the major parts is presented. The functions of persistent messaging, message preview and message selection are provided. The service quality of the product is improved.
        Keywords: object-oriented technology; Java-based communication middleware; communication software; object serialization
        1 总体设计
        通信中间件[1]目前并无标准可循,一般把工业标准TCP/IP协议作为基础,遵循X/Open的分布式计算环境需求多样化、用户数目规模化、业务逻辑复杂化的发展要求,实现消息位置无
关性、用户透明性。应用程序使用通信中间件提供的通信服务,遵循中间件提供的通信协议进行相互间的通信。解除应用程序和通信介质(或网络)以及远程应用程序之间的偶合。
        本文所述的通信中间件采用集中式的通信方式。其设计思路来源于中间件模式[2]。结构如图1所示。
        1 通信中间件结构图
        通信中间件由一个消息网关和多个Agent组成。消息网关是系统的核心,它完成消息转发功能。为了保证通信的可靠性,消息网关与Agent的通信基于TCP协议。为了提高端到端通信的QoS,在消息网关中引入了并发处理,这样可以防止因为流量控制造成的阻塞等待对性能的影响。
        Agent位于每个通信进程内部,向上层应用提供统一的通信接口,屏蔽通信细节。Agent为上层应用模块提供了两种不同的接口[3]:同步通信接口和异步通信接口。
        一个设计良好的通信中间件因该具有良好的可移植性、可扩展性和可复用性,同时还要保持高效率和使用方便等特点。面向对象技术是开发它的理想工具。
        2 开发工具介绍
        本系统的开发,使用了Java提供的许多工具[4],他们包括:
        2.1 多线程支持
        “线程是进程内部单一的一个顺序控制流,一个进程可能容纳了多个同时执行的线程。多线程的应用范围很广。当程序的一些部分同特定的事件或资源联系在一起,同时又不想为它而暂停程序其他部分的执行。可考虑创建一个线程,令其与那个事件或资源关联到 一起 ,并让它独立于主程序运行。
        Java提供了一套内建的机制,提供对多线程的支持。为创建一个线程,最简单的方法就是从Thread类继承。这个类包含了创建和运行线程所需的一切东西。Thread最重要的方法是run(),它包含那些会与程序中的其他线程并发同时执行的代码。通过对其进行过载或者覆盖,使其能充分按自己的吩咐行事。通过实现Runnable接口也可以将一个类改造成线程。
        在本系统中,为了提高系统的运行效率和并发处理能力以及阻塞通信方式的使用,大量的采用了多线程的实现。Agent中的消息分发器采用了单独的线程实现。Reactor中引入了线程
池对收到的消息的并发处理。Gateway中的消息接收和消息发送功能都是采用单独线程实现。
        2.2 对象序列化处理
        对象序列化(Object Serialization)面向那些实现了Serializable接口的对象,将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。本系统内部,网关和Agent之间传递消息,采用了序列化机制,将消息封装成对象,利用Java的序列化机制直接传送对象,简化上层应用对消息的封装与解析。
        2.3 通信对象
        Java库的I/O[5]分为输入与输出两个部分。输入、输出的源地和目的地包括(每个都有一个相关的InputStream子类):字节数组、String对象、文件、管道、一系列其他以及Internet连接等。与输入有关的所有类都从InputStream继承,而与输出有关的所有类都从OutputStream继承。JavaI/O类库采用的是分层的设计原则,InputStreamOutputStream类以及它们的子类处于底层,一般的I/O操作很少直接使用它们,一般都使用建立在它们上的装
饰器类将多个对象重叠在一起,提供自己期望的功能。对于序列化对象的I/O,Java提供了装饰器类ObjectInputStreamObjectOutputStream
        3 Gateway的设计与实现
        Gateway是通信系统中的中间件,它消除了各个通信端点之间的紧偶合,提高了整个通信系统的灵活性。它实现为一个单独的进程,在应用系统运行过程中始终保持运行状态。
        3.1 功能结构设计
reactor软件        Gateway的功能结构如图2所示。通过分离输入和输出功能,减少他们之间以及多个不同的通信连接之间的相互影响,提供了对不同的输入和输出使用不同的并发策略的可能性。整个消息的传递过程可以分为 三个 阶段:输入处理阶段、路由选择阶段和输出处理阶段。
        2 网关功能结构图
        消息接收功能与Agent通信,接收Agent发来的消息,并将消息送给消息发送功能;路由功能完成路由选择;消息发送功能接收待发送的消息,将它们发往目的Agent,发送功能内部维护一个消息发送队列,实现流量控制;监视功能监视发送和接收功能,及时释放无用的通信资源。
        3.2 Gateway的实现
        3.2.1 静态结构
        网关实现为一个单独运行的进程,为了提高运行效率,它的内部采用多线程方式,实现并发处理。类图表现了网关的静态组成结构。类图如图3所示。
        3 Gateway的类图
        Gateway是网关进程的入口。main()方法启动Gateway,完成Gateway的初始化配置[6]。实现如下:
        public static void main(String[] args) {
        ……
        Factory factory = Instance(); /*获取Factory 的全局惟一实例*/
        Timer
        run()
        timestart()
        timestop()
        ……
        factory.make_monitor(); /* 启动后台监视线程 */
        factory.make_routetable(); /*创建路由表 */
        factory.make_acceptor_handler(); /* 打开通信端口,接收Agent 的连接请求*/
        ……
        }
        SvcHandler,AcceptorHandlerRegisterHandler实现了同步的Acceptor模式。类AcceptorHandler接收Agent的连接请求,完成连接初始化工作。类RegisterHandler完成服务
初始化,认证Agent的合法性,对于合法的Agent,建立通信结构Commstruture并在路由表中增加相应的记录。
        3.2.2 动态结构
        网关的实现充分地利用了Java的多线程机制[7],组成网关的类通过继承Thread,实现为线程,在运行时可以并发的运行。运行中的网关包括多个线程。这些类包括:Monitor,AcceptorHandler,RegisterHandler,SenderReceiverMonitorAcceptorHandler线程有着和网关进程一样的生存期,网关启动后立刻被启动,网关退出时被杀死。AcceptorHandler阻塞等待,直到收到某个Agent发来的连接请求,启动一个RegisterHandler线程处理该请求。RegisterHanler线程验证请求连接的Agent的合法性,接收合法的Agent的连接请求,建立并保存与之通信的通信结构,处理完毕后RegisterHandler线程死掉。与Agent通信的通信结构中包括两个线程:SenderReceiver,在与对应的Agent通信有效期内生存。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。