3中间件的原理
由中间件的定义可看出,中间件的核心在于网络通信,将不同时期、不同操作系统上开发的系统集成起来,彼此协调
工作,这是单一的操作系统、数据库系统无法解决的
问题。目前国际互联网络中事实上的网络通信协议是TCP/IP协议,许多应用层协议均以该协议为基础。Java语言可用于网络编程,提供了功能强大的网络支持,URL访问网络资源的类和Socket通信的类来满足不同的需求。客户基于服务器之间的使用的大部分通信都是基于TCP/IP协议中传输层接口Socket来实现的,它解决了两进程间通信的问题。Socket其实就是进程间点对点的通信,是网络编程的一个接口。Socket通信模式如图1所示。Socket因为是基于传输层的,所以是比较原始的通信协议。通过Socket的数据表现形式为字节流,因此,通信双方要想完成某项具体应用必须按照双方约定的方式进行数据的格式化和解释。虽然使用Socket编程相对比较麻烦,但是它具有更强的灵活性和更广泛的使用空间。
Socket由主机地址、端口号、协议种类构成。一般一个主机会提供多种服务,一个服务会由一个或多
4
个进程来实现,而每个进程会由端口号来标识,它是网络协议软件和与应用程序打交道的结合点。这样网络环境下的进程间通信,必须指定主机地址、端口号、协议种类。
4中间件的设计实现
4.1示例
现以某自来水公司收费系统的一个子系统为例来阐述中间件的设计实现。该子系统的架构与部署如图2所示。水费由各银行网点代收,银行网点1到银行网点由于历史原因,各银行网点的终端机软硬件环境不尽相同,采用了不同的编程语言和技术来实现,子系统在原来系统的基础上进行二次开发,新增的中间件部署在各个服务器上,利用Socket与各网点的终端机进行信息的交互,中间件将从各终端发来的字节流转换为字符串再传给后台的数据库处理,数据库处理完后将结果以字符串形式返回给中间件,中间件再将该字符串信息转换为字节流返回给各银行网点的终端处理。
在Java中,用数据流表示字节级的通信,数据流是发送和接收信息(数据字节)的管道。以流来表示网络上文件之间,甚至应用程序之间的通。Java流分为字符流和字节流。二者的区别是字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和Java内Unicode字符流之间的转换[3]。设计系统时,必须选择正确的流,对应不同的流,需要不同的流构建器或流过滤实现。
4.2配置文件
由于中间件会部署在不同的服务器上,因此要允许一些环境参数由用户修改设置。中间件也可能部署在不同的语言环境中,一些提示信息是中文还是英文以及提示内容均可由用户修改定制。这些都由配置文件来存储。例如以下一些参数存放在SysConfig.properties文件中。#DataBaseparametersDBServer=192.168.17.12DBUser=test
5
DBPassword=test#MessageInformationMsgl=正在连接服务器Msg2=connectingtoserver类SysConfig用于读取该配置文件中存储的参数。publicclassSysConfigextendsProperties{privatestaticSysConfiginstance=null;publicstaticsynchronizedvoidinitialize(Propertiesprops){//单例模式if(instance!=nul1){return;}instance=newSysConfig(props);}protectedstaticsynchronizedvoidinitialize(){if(instance!=nul1){return;}Propertiesprops=newProperties();FilesysConfigName=null;FileInputStrea
mis=null;try{sysConfigName=newFile(“sysconfig.file”);is=newFileInputStream(sysConfigName);}catch(FileNotFoundExceptione){}if(is==nul1){System.Err.println(“Error:SysConfigfilenotfound!”);}try{props.1
oad(is);}catch(IOExceptione){}try{is.close();}catch(IOExceptione){}initialize(props);}publicstaticSysConfiginstance(){if(instance==nul1){initialize();}returninstance;}//其余略}比如要取出数据库服务器的值,只需调用该语句即可取得:SysConfig.instance().getProperty(”DBServer”)。