| |
基于JMS的数据汇集系统的研究与实现 |
|
时间: 2006-04-07 来自:计算机与信息技术 |
 |
|
系统的设计与实现
目前,基层气象台站的每个分系统都是独立的,各自的数据都保存在本机上,彼此互不联系,而汇集系统就是为了把分散在每个系统上的数据汇集到一个统一的数据库中。为了实现这个目的可以有多种方法。
(1)由各个分系统解析本机的数据,然后直接向数据库中写记录,但是这样势必对统一数据库的安全性造成影响,而且各分系统的计算机莨莠不齐,老旧的机器能不能提供更多的资源也是一个问题;
(2)由服务器上的一个程序统一从各个系统上获取数据,然后写入数据库,但是这样该服务器程序与各个分系统便形成了紧耦合,一旦分系统发生变化,或者要扩展一个分系统便要重新更改程序代码,使得整个系统的稳定性和可扩展性受到很大影响;
而JMS消息机制的异步传输模型恰好能完美的解决以上两种方法存在的问题。
1、系统的设计
基于JMS的气象数据汇集系统由五个模块组成:代理模块、消息发送模块(MessageSender)、消息接收模块(MessageReceiver)、数据格式转换模块(DataFormatConverser)和统一数据库访问接口(UDAI)。系统结构图如下图所示:

基于JMS的气象数据汇集系统结构图
(1)代理模块
代理模块是运行于分系统上的Java程序,它只有两个功能:监测到有新数据到,立即将数据文件复制到服务器上的文件缓冲区,然后调用消息发送模块,并将数据文件的文件名,文件大小,生成时间,业务属性等信息传递给消息发送模块。由于代理程序不需要解析数据文件,也不需要写数据库,降低了对系统资源的消耗,即使在比较老旧的机器上运行也不会出现问题。而且一旦消息发送成功,后面的工作便与分系统无关,这样也就解除了分系统和服务器之间的耦合。
(2)消息发送模块
消息发送模块作为一个会话Bean部署在服务器上,它的功能主要是:将代理模块传来的数据文件的文件名,文件大小,生成时间,业务属性等信息组装成消息,然后发送到与其业务属性相对应的消息队列中(每一类业务属性对应一个消息队列)。消息发送模块运行与服务器上的Bean容器中,不占用分系统资源,减小了分系统上的资源开销;而且该模块被部署为一个Bean,方便了以后分系统的扩展和变化。
(3)消息接收模块
消息接收模块是一个运行于服务器端的JMS客户端,每一个消息队列都对应一个消息接收模块。消息接收模块通过注册一个MessageListener接口,监听消息队列上的消息;接收到消息后便调用数据格式转换模块,将消息内容和数据文件在文件缓冲区的绝对地址作为参数传给数据格式转换模块。之所以为每一个消息队列对应一个消息接收模块,是考虑到以后系统的扩展,如果要增加一个队列,只需增加一个接收模块,并不影响原来系统的正常运行。
(4)数据格式转换模块
数据格式转换模块的主要功能是:解析数据文件并按照一定的格式生成标准的XML文档供统一数据库访问接口使用。
(5)统一数据库访问接口
统一数据库访问接口提供一个统一的数据库写入接口,不管以后系统如何变化,只要生成标准的XML文档便可以使用此接口来访问数据库。
系统中真正与JMS相关的模块是消息发送模块和消息接收模块,由于每一类业务属性对应一个消息队列,每一个消息队列对应一个接收模块,所以选择PTP的传递模式作为系统的消息传递模式。
2、系统的实现
(1)建立消息队列
系统使用JBoss作为J2EE服务器,通过编辑配置文件jbossMQ-destinations-service.xml来定义应用所需的消息队列地址信息。其部分代码如下:
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=RadarQueue"> <depends
optional-attribute-name="DestinationManager"> jboss.mq:service=DestinationManager</depends> <depends
optional-attribute-name="SecurityManager"> jboss.mq:service=SecurityManager</depends> <attribute
name="SecurityConf"> <security> <role name="guest" read="true"
write="true"/> <role name="publisher" read="true" write="true"
create="false"/> <role name="noacc" read="false" write="false"
create="false"/> </security> </attribute> </mbean>
| (2)消息发送模块的实现
MessageSender
SessionBean的功能是构造消息并向指定的消息队列发送消息,其部分代码如下:
//构造TEXT消息
message.setText(dataInfo);//设置消息体
//发送消息
Context
context = new InitiaContext();//获取上下文环境 ConnectionFactory
connectionFactory = new
(ConnectionFactory)context.lookup(“java:comp/env/JNDIConnectionFactory”);
Connection
connection = connectionFactory.createConnection(); Session session
=connection.createSession(false,AUTO_ACKNOWLEDGE); Destination
messageQueue = (Destination)context.lookup(“java:comp/env/
RadarQueue”); MessageProducer producer =
session.createProducer(messageQueue); producer.send(message); …… | (3)消息接收模块的实现
消息接收模块通过注册MessageListener接口来监听消息队列,实现其onMessage()方法处理消息。其部分代码如下:
Public class MessageReceiver implements
MessageListener{ …… public void onMessage(Message
message){ …… dataInfo =
((TextMessage)message).getText();//获得数据文件信息 …… //调用数据格式转换模块 …… }
| 结束语
本系统应用JMS异步消息作为分系统与服务器的关联机制,分系统只需要通过消息向服务器提交任务,之后便不需要关心数据如何处理,何时处理,彻底解开了分系统与服务其的耦合,即保证了数据库的安全可靠,也减少了分系统的资源消耗。而且系统的各个模块都是相对独立,对于今后的变化和进一步的扩展提供了更大的空间。
133
|
|
|
|
|
|
|
|