- 浏览: 1200657 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
摘要 在深入研究JMS异步消息处理机制的基础上,利用JMS为分布在不同系统中的气象数据的汇集提供了一个可行的方案,解开了应用程序间的耦合,并增强了应用程序的可扩展性和可靠性。
关键词 消息、JMS、点对点、发布/订阅、数据汇集、气象
现如今,越来越多的企业、单位面临着各种各样的数据集成和系统整合,CORBA、DCOM、RMI等RPC中间件技术也应运而生,但由于采用RPC同步处理技术,在性能、健壮性、可扩展性上都存在着诸多缺点。而基于消息的异步处理模型采用非阻塞的调用特性,发送者将消息发送给消息服务器,消息服务器在合适的时候再将消息转发给接收者;发送和接收是异步的,发送者无需等待,二者的生命周期也可以不必相同,而且发送者可以将消息间接传给多个接收者,大大提高了程序的性能、可扩展性及健壮性,这使得异步处理模型在分布式应用上比起同步处理模型更具有吸引力。
本文详细介绍了Java中的异步处理机制――基于JMS的异步消息处理技术,并结合实例讨论了基于JMS的气象系统数据汇集系统的设计与实现。
Java消息服务-JMS
JMS是由包括Sun Microsystems和IBM等在内的几个公司合作设计的一个面向消息的中间件(MOM)API。JMS定义了Java 中访问消息中间件的接口,但JMS 只是接口,并没有给予实现,实现JMS 接口的消息中间件称为JMS提供者(JMS Provider)。JMS的目的是应用程序能在异步情况下可靠地传输和接受消息。从编程的角度来看,JMS可以被当作一个容器管理的资源,与JDBC连接类似。正如你可以通过JDBC去访问许多不同的关系数据库一样,你可以通过JMS访问独立于厂商的消息服务系统。
JMS主要包括三个部分――JMS提供者(JMS Provider)、消息发送者(Message Producer)和消息接收者(Message Consumer)。简单的说,JMS提供者是指实现JMS API接口的消息系统,是消息的中转站;消息发送者是指消息的创造和发送者,是消息的发源地;消息接收者是指接收消息的应用程序,是消息最终的目的地。
JMS消息是异步处理的,消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接收者则订阅或是监听该通道。一条消息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。
1、JMS消息的组成
在J2EE1.4后,JMS API不再区分在点对点域和发布/订阅域中创建的消息。JMS消息由以下三部分组成(如图1.1所示):
消息头(header)――JMS消息头包含了许多字段,它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。
属性(property)――由消息发送者产生,用来添加删除消息头以外的附加信息。
消息体(body)――由消息发送者产生,JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。
2、JMS消息传递模式
JMS支持两种消息传递模式――点对点模式(P2P)和发布/订阅模式(Publish/Subscribe)。这两种都是人们熟知的push模式,消息的发送者是活动的发起人,而接收者则是被动的接收消息。在JMS中,这些消息传递模式被称为消息域(message domain)。
2.1 JMS点对点消息域
在点对点模式中,发送者和接收者对消息传送的目的地址达成一致,即所谓的队列(queue)。消息队列位于JMS提供者中,消息发送者向一个消息队列发送消息,消息接收者可以在消息发送后的任何时刻从这个队列中(被动地)接收消息,在接收者确认之前消息一直保存在消息队列中直到过期。点对点模式的结构图如图1.2所示:
JMS点对点消息域具有以下特点:
·每条消息能而且只能被一个接收者接收。
·每条消息或者被接收者从队列中取走,或者被 JMS提供者在超时的情况下删除。
·消息产生的时候接收者不一定要存在,接收者可以在消息产生后的任何时间里取走消息。
·接收者不能请求一个消息。
·接收者必须在收到消息后发出确认信息。
2.2 JMS发布/订阅消息域
在发布/订阅模式下,发送者被称为发布者(publisher),一个消息可已有很多接收者,这些接收者被称为订阅者(subscriber)。发布/订阅模式采用与点对点模式完全不同的消息发送模式。在发布/订阅模式下,发布者给一个主题(topic)发送消息,多个订阅者在订阅的时候可以订阅他们感兴趣的主题。一个主题可以被多个订阅者订阅,一个订阅者也可以订阅多个主题。一个主题的消息只被发给该主题的所有订阅者。订阅者只能接收它订阅的主题中的消息,并且,在默认情况下,订阅者在消息发送的时候必须是活动的,并随时准备接收消息,否则它将错过该消息。为了避免这种时间依赖性JMS API允许订阅者创建持久订阅。发布/订阅模式的结构图如图1.3所示:
JMS发布/订阅消息域具有以下特点:
·每一条消息由一个发布者创建而由0个或多个订阅者接收它。
·消息立刻被分发给现有的订阅者。
·订阅者必须在消息发送的时候存在以接收消息。
·持久订阅允许订阅者接收它处于非活动状态时由发布者向主题发送的消息。
·订阅者必须在接收到消息后发出确认信息。
系统的设计与实现
目前,基层气象台站的每个分系统都是独立的,各自的数据都保存在本机上,彼此互不联系,而汇集系统就是为了把分散在每个系统上的数据汇集到一个统一的数据库中。为了实现这个目的可以有多种方法。
(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异步消息作为分系统与服务器的关联机制,分系统只需要通过消息向服务器提交任务,之后便不需要关心数据如何处理,何时处理,彻底解开了分系统与服务其的耦合,即保证了数据库的安全可靠,也减少了分系统的资源消耗。而且系统的各个模块都是相对独立,对于今后的变化和进一步的扩展提供了更大的空间。
发表评论
-
jms&mdp
2010-06-20 17:10 0jms&mdp -
spring rmi 小例子
2009-12-02 17:19 21331 下载 2 导入eclipse (java projec ... -
用ajax发送jms消息,并监听指定队列,并从中取出消息的小例子
2009-11-18 13:41 3401用ajax发送jms消息,并监听指定队列,并从中取出消息的小例 ... -
activemq的小例子
2009-11-18 11:50 1635两种JMS的实现方法: Topic==>消息主题 是发布 ... -
消息队列技术的介绍和原理(MQ)
2009-04-05 01:47 17041消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在 ... -
利用JMS Topic发布/订阅消息
2009-03-01 16:20 69902003年3月11日那一期(使用JMS Queue) 解释了如 ... -
JMS概念和基于weblogic下的JMS配置和客户端调用收藏
2009-03-01 12:01 35211. JMS基本概念 JMS(Java Message Ser ... -
JMS 公共接口
2009-03-01 09:22 1478关键字: JMS ConnectionFactory 是 ... -
在Spring中配置JMS
2009-03-01 08:16 2147郁闷了三天,今天终于把JMS弄出来了,就是发送消息,然后消息 ... -
ActiveMQ 实践之路(四) ActiveMQ 4.x +JBoss 4.x MDP实战篇
2009-03-01 07:53 1907关键字: ActiveMQ Activ ... -
ActiveMQ 实践之路(三) ActiveMQ 4.x +JBoss 4.x 整合篇
2009-03-01 07:51 1527关键字: ActiveMQ ... -
ActiveMQ 实践之路(二) 使用Queue或者Topic发送/接受消息
2009-03-01 07:49 2725本篇主要讲解在未使用 ... -
ActiveMQ 实践之路(一) 启动你的ActiveMQ
2009-03-01 07:48 1691ActiveMQ 实践之路(一) 启动你的ActiveMQ ... -
activeMQ 的 Queue 的生产和消费
2009-02-28 06:03 2223概念:两种JMS的实现方法: Topic==>消息主题 ... -
面向消息的中间件和ActiveMQ的介绍
2009-02-28 01:26 2622面向消息的中间件和ActiveMQ的介绍 关键字: MOM J ...
相关推荐
内容为基于JMS的消息中间件的研究与实现,格式为CAJ,页数为54
基于JMS的数据推送系统的设计与实现,是一篇深入探讨Java消息服务(Java Message Service,简称JMS)在数据推送系统中应用的论文。文章不仅介绍了JMS技术的基础概念,还通过实际业务需求案例,详细阐述了一个多对一...
基于JMS的新闻系统
【基于J2EE酒店管理系统设计与实现】 J2EE(Java 2 Platform, Enterprise Edition)是一种广泛应用于企业级应用开发的平台,它提供了一个多层架构模型,支持分布式计算和跨平台兼容性,使得开发复杂的、可扩展的、...
标签包括“分布式”、“分布式系统”、“分布式开发”和“参考文献”,这暗示了文章会深入讨论分布式系统的设计和开发,特别是与数据同步相关的技术和实现细节,同时,它可能提供了其他相关研究的参考资料。...
内容为JMS消息中间件在数据集成系统中的研究与应用,格式为CAJ,页数为为54
基于JMS和XML的用户状态实时监控系统的设计与实现这一主题的研究,是围绕如何利用消息驱动架构实现用户状态监控的系统设计。在这一过程中,JMS(Java消息服务)用作消息的交换基础设施,而XML(可扩展标记语言)则...
《基于JMS和XML的异构数据交换平台的研究》这篇论文探讨了一种利用JMS(Java消息服务)和XML(可扩展标记语言)技术构建的异构数据交换平台,旨在解决不同系统之间的数据共享和传输问题。JMS作为标准的消息中间件,...
Java实现的基于JMS(Java Message Service)协议的消息队列中间件是一种用于应用程序间异步通信的重要技术。消息队列允许应用程序将消息发送到队列而不必等待接收方的响应,提高了系统的可扩展性和容错性。JMS是Java...
深入研究Java消息服务(Java Message Service,JMS)技术,结合其中的"发布/订阅式"和"点对点式"两种消息收发模式,提出了一个基于JMS体系结构的全新的消息服务模型,并针对股票交易系统中的报价"发布/订阅"服务功能的具体...
《电子功用-基于JMS消息的电力调度实时数据发布系统及方法》是针对电力调度领域的一项重要技术,它利用了Java消息服务(JMS)来实现实时数据的有效传输和处理。这一系统的设计与实现旨在提升电力调度的效率、可靠性...
### 基于DDS的实时数据分发系统的研究与实现 #### 1. 引言 随着互联网技术的快速发展及广泛应用,以及计算机技术的不断进步,现代应用系统的架构正逐步向着网络为中心的方向转变。这种转变对通信的实时性、动态...
在本系统中,JMS作为中间件,用于生产者消费者模式下的消息传递,它使得系统中的消息队列能够有效地处理订单校验任务,提高了系统的可靠性和可伸缩性。 3. **生产者消费者模式**: 在订单后督系统的设计中,生产者...
综上所述,"基于JavaEE的新闻发布系统的设计与实现"项目涵盖了Web开发的多个方面,包括后端服务、数据库管理、用户交互、安全性以及性能优化。通过深入学习和实践,开发者不仅能掌握JavaEE技术,还能构建出高效、...
尤其在大型企业中,通常存在多种不同类型(即异构)的数据库系统,如何在这些异构系统之间实现数据同步,对于提升整体业务流程的效率和准确性至关重要。 #### 2. JMS架构及相关概念 ##### 2.1 JMS架构组成 JMS...
本篇论文研究了基于Java消息服务(JMS)和消息中间件(MOM)的信息交换系统。信息交换系统在杭州市政府办公数字化过程中发挥着至关重要的作用,特别是在处理大容量信息交换的需求方面。本文提出了一种基于JMS和MOM的...
本文不仅展示了JMS与JMX结合的创新应用,而且为消息中间件的开发提供了理论支持和实践指导。对于理解和实现高效的消息服务系统具有重要的参考价值。 本文的贡献在于为开源社区提供了宝贵的参考资源,并鼓励了更多的...