JMS面向Web的应用与面向桌面的应用相比,有特殊的用户环境要求:同一个消息必须能被若干未知的用户消费,因此在消息接收方必须有"接收而不确认"的提交机制;本文以CWNF校务系统为实现案例,讨论面向Web的JMS应用系统消息提交原理及采用的关键技术。

消息传递是一种在软件组件或应用之间进行分布式通信的松散耦合方法,与各种紧密耦合通信技术(如CORBA、Java RMI、COM/DCOM)相比,不同之处在于:①消息系统是一种对等实施,通信双方即消息的发送者和接受者都是该系统中的客户端,彼此不呈C/S关系;②通信双方的工作是异步的;③基于消息格式一致,通信双方只需一个中介来存储并管理消息就可以实现通信,而紧密耦合技术则需要知道远程方法在本地的接口。因自身特点,消息传递技术在企业中和企业间有较广泛的应用需求。

JMS(Java Message Service)是J2EE企业平台的Java消息服务,目前主流J2EE产品的JMS都实现了存储功能,JMS客户端通过JMS API创建,彼此间通过目的地(Destination)对象进行通信;可是JMS消息系统多见于桌面应用,而Web应用鲜见,本文以笔者开发的CWNF校务系统为案例,讨论面向Web的JMS应用系统的实现原理及采用的关键技术。

1  面向Web的JMS应用系统实现原理

1.1  JMS应用系统消息传递原理

JMS应用系统有4个部分:①JMS提供者(JMS Provider),是一个逻辑数据存储体,并提供管理工具和控制特性;②JMS客户端,是用Java语言编写的发送或接收消息的组件或应用;③消息,是JMS客户端间被传递的承载信息的对象;④被管理对象,是系统管理员为客户端预置的JMS对象,包括目的地对象和连接工厂对象,其中目的地对象是客户端间的消息中介。这4个部分通过JNDI相关联:管理员通过管理工具把目的地对象和连接工厂对象绑定到一个JNDI API命名空间中,JMS客户端就可以在命名空间中查找这些对象,并通过JMS提供者建立与这些对象的逻辑连接,从而彼此之间实现通信(图1)。JMS支持2种消息传递域:点到点、发布/订阅,与之相对应的消息目的地对象也有2种:队列、主题。

1.2  Web应用的消息提交机制

通常,无论是消息发送方还是接收方,桌面应用都不容许消息丢失或重复,JMS消息提交机制是基于这个要求的,它们从不同方面保证该要求的实现:①在接收方控制消息的确认。通过确认保证一个接收者对一个消息只消费一次,在非事务性的会话中,消息确认方式取决于create×××Session方法第二个参数的值;在事务性会话中,无论由Bean管理事务还是由Bean容器管理事务,消息确认都由Bean容器自动完成。②在发送方指定消息的提交模式和生存期。提交模式有两种:PERSISTENT(稳定存储)和NON_PERSISTENT(非稳定存储),稳定存储保证在故障情况下消息不会丢失;生存期决定一个消息在存储中介中的存在寿命,JMS提供者会自动摧毁到期的消息。③创建持久定阅的接收方。在发布/订阅系统中,持久订阅者可以接收到在订阅者关闭阶段消息发送方发布的消息。

但是Web应用系统在消息接收方有Web特有的用户环境要求:①若干个用户共用一个JMS客户端组件,因此消息就应向一个消息接收者提交而不需确认,具有容器自动确认功能的Bean是无法实现这一要求的;在一个组件内如果把会话设置成事务性的,而这个组件的容器又不具有事务管理能力,则这个组件就能做到"接收而不确认",在Web应用系统中只有Servlet组件符合这一要求。②JMS客户端的消息接收者经常关闭,为了接收在关闭期间发送来的消息,消息接收者必定是基于主题的持久定阅者,所以面向Web的JMS应用系统必定采用发布/订阅消息传递域。

2  CWNF校务系统模型

CWNF是一个面向Web的JMS校务系统,用于校园发布通知及征求意见等校务工作,通知分为2类:普通通知和征求意见性通知。

该系统用户分成3类,用户不同,处理模型也不同,基本情况如下:①发布用户,拥有通知发布权,向主题发布通知;②署名用户,查阅通知,也可发表对征求意见性通知的反馈意见;③匿名用户,只查阅通知。

2.1  数据与数据流模型

系统中的数据因此有2类:通知、反馈。接收方接收的数据将形成一个XML文档对象,以便发往Web浏览器显示;基于这样的要求,考察下面2个问题:①系统中各方之间的数据关系,②各方数据的形式。

主要的数据关系有3个:①通知发送方与通知接收方的数据关系,②反馈发送方与反馈接收方的数据关系,③通知接收方与反馈接收方的数据关系。(如图2)在发送方,数据(通知或反馈)是一件一件的发送,在接收方,数据(通知或反馈)则是批接收,是对应发送方数据的集合,因此在发送方没有必要把数据直接加工成XML文档对象形式,只要生成能构成XML文档对象的元素对象即可;而通知接收方与反馈接收方的数据关系则是:每一条征求意见性通知都有相关的一个反馈集合。

系统的数据流模型如下:

①通知发送方:表单数据→XML元素(通知)→主题(存储)

②通知接收方:主题(存储)→XML元素(通知)→XML文档(通知)→XSL显示(含表单)

③通知接收方到反馈接收方: XSL显示(含表单)→主题(存储)

④反馈接收方:主题(存储)→XML元素(反馈)→XML文档(反馈)→XSL显示(含表单)

⑤反馈发送方:表单数据→XML元素(反馈)→主题(存储)

2.2  组件模型

系统组件模型如图3:主题CWNFTopic是消息传递中介,NoticerServlet组件向发布用户发送表单,并从表单接收数据,然后生成XML元素对象,该元素对象和其它一些数据被作为参数调用PublisherBean组件方法,向主题发送以该元素对象为消息体的消息;ReaderServlet组件处理署名用户和匿名用户查阅通知的业务,它从表单获得用户将查阅什么方面通知的有关信息后,便使用receive方法限时阻塞地从主题接收消息并对消息进行筛选,把筛选出的若干消息的消息体取出,然后加工成XML文档对象(根元素是通知集),最后输出。FeedbackerPubServlet用于反馈发送方的业务处理,功能与NoticerServlet相似;FeedbackerSubServlet用于反馈接收方的业务处理,功能与ReaderServlet相似;PublisherBean组件被NoticerServlet组件和FeedbackerPubServlet组件调用,用于发送消息,容器管理发送事务,具有很高的可靠性。

3  关键的实现技术

3.1  JDOM建立、输出XML文档

JDOM是一个开放源代码的纯Java树式API,用于分析、建立、处理和序列化XML文档。在数据流模型中,XML元素和XML文档都由JDOM API建立,在发送方,通过用户提交的表单取得名/值对若干,这些数据经过JDOM方法处理生成XML元素对象,元素对象被作为消息的消息体发往主题存储;在接收方,持久订阅者接收到若干XML元素对象后,继续通过JDOM方法建立XML文档对象。且XML文档向Web浏览器输出也依赖于JDOM的XMLOutputte对象方法:

XMLOutputter serializer=new XMLOutputter();

...

PrintWriter out=response.getWriter();// out 是ServletResponse的输出流对象

serializer.output(xmldoc,out);//通过out把XML文档输出到页面

3.2  XSL定义XML文档显示样式

XSL是可扩展的样式单语言,通知集的XML文档和反馈集的XML文档都有相关的XSL文档决定其页面显示,如通知集XML文档的XSL样式定义如下:

...

...

3.3  Servlet间数据的传递

3.3.1  注册/登录

用户的一些处理工作需要注册/登录后才能进行,因此注册/登录的获准信息必须能在有关Servlet组件之间传递。ServletContext 对象可设置和读取属性,使不同Servlet之间相互通信,在系统中被用于有关组件对用户身份的验证。

3.3.2  通知与反馈的数据关联

每一条征求意见性通知都有一个相关联的反馈集合,关联可通过设置消息属性实现。JMS消息(包括通知类消息)都有系统级JMSMessageID属性,其值是唯一的,可用于表征每一条征求意见性通知,因此对任何反馈消息也可以设置一个应用级属性(CWNF中是FeedbackSN),让它取与之相关联的征求意见性通知的JMSMessageID属性值。这样就建立了两者间的数据关联。

因此数据流模型"③通知接收方到反馈接收方: XSL显示(含表单)→主题(存储)"的实现流程如下:用户在页面上选择一条征求意见性通知后,该通知的JMSMessageID属性值将被传递给FeedbackerSubServlet组件,该组件将使用这个属性值去匹配从主题取出的反馈消息的FeedbackSN属性,从而筛选出相关联的反馈消息。

那么一条征求意见性通知的JMSMessageID属性值又如何传递给FeedbackerSubServlet组件呢?通过ServletContext对象只能传递可预知信息,CWNF的做法是:由XSL为每一条征求意见性通知设置一个独立的表单,并把该通知的JMSMessageID属性值写在表单的TEXTAREA元素框内,这样用户在表单上选择一条征求意见性通知后,该通知的JMSMessageID属性值就随表单一起提交给FeedbackerSubServlet组件。XSL有关代码如下:

意见反馈

4  结束语

JMS应用系统与数据库系统有相似性,从数据方面看,JMS消息体的数据类型支持文本和对象,所以JMS更灵活,与XML集成应用的空间更大;但从管理上看,JMS Provider向管理员提供的管理功能远远低于DBMS提供的管理功能,因此在面向Web的应用中,JMS宜作为中小流量、管理员参与度较低的信息系统解决方案。

CWNF校务系统经校园网实验性运行,效果良好,验证了面向Web的JMS应用是可行的。

posted on 2007-05-24 15:06 ☜♥☞MengChuChen 阅读(192) 评论(0)  编辑  收藏 所属分类: JAVAEE

jms是java平台中面向_面向Web的JMS应用系统相关推荐

  1. jms是java平台中面向_Jms学习篇一:JMS介绍

    1.JMS介绍: JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API JMS是一种与厂商无关的 API,用来访问 ...

  2. Java 平台中的增补字符

    作者:Sun Microsystems, Inc. 的 Norbert Lindenberg 和 Masayoshi Okutsu 2004 年 5 月 English: Supplementary ...

  3. java平台无关性_为什么Java能够实现平台无关性?

    前言从最初学习Java开始,我们就知道Java的口号是:"一次编写,到处运行".没有了平台的束缚,使得我们再编写Java时并不需要(那么)关心将来运行程序的平台. 那么,Java是 ...

  4. java 接口中 常量_在Java接口中怎样访问定义的常量呢?

    java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...

  5. 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现

    基于web的花店销售系统的设计与实现(论文13000字) 摘要:本系统是一个相对简单的基本应用系统,主要满足传统的花店运营需要,将自己的销售渠道扩展到网上,通过简单的管理,提供给最终消费者产品的展现. ...

  6. 基于python网上订餐系统哪家好_基于web的网上订餐系统的设计与实现-毕业论文...

    基于 web 的网上订餐系统的设计与实现 摘要 : 由于因特网技术的高速发展, 人们生活与网络的脚步也随之越来越紧密. 同时也随着市场化和经济全球化越来越多的普及, 众多国内外企业都深刻地认识 到想要 ...

  7. Web的入侵防御系统的设计_服务器,Web的入侵防御系统的设计分享

    Web的入侵防御系统的设计分享 0引言 随着网络技术的不断发展和深入应用,人们对网络的安全性和可管理性的要求也越来越高,与此同时网络hacker的攻击方式,也变得越来越多样化,技术的复杂程度也越来越高 ...

  8. java面向对象跑马游戏_面向“对象”和“过程”

    在学习软工视频的时候总是想不明白,面向对象和面向过程,这两个东西字面上肯定能分得清,这个是没有问题的,但是具体到怎样算是面向对象,怎样又是面向过程?这样一问,大概模糊的想法还是有的,毕竟是模糊的. 面 ...

  9. java编程工具 初学者_面向初学者的Java编程在线课程

    java编程工具 初学者 There are many java programming course online provided by many services. I use Udemy be ...

  10. 学生java用什么编译器_面向学生的6大在线Java编译器

    学生java用什么编译器 您想开始使用Java吗? 您是一个不耐烦的程序员,不想在您的计算机上安装任何软件吗? 直到最近,您还没有太多选择. 您必须下载Java编译器或下载并安装Eclipse之类的I ...

最新文章

  1. Android应用程序安全改进:回顾2016年
  2. asp.net 导出excel带图片
  3. 【Pygame小游戏】剧情流推荐:什么样的游戏才能获得大家的喜欢呢?(魔鬼恋人、霸总娇妻版)
  4. ssm实现管理员和用户_基于SSM的网上水果生鲜超市商城管理系统
  5. 在受了老板的委屈时候写下的
  6. 005.在Windows下编程让效率起飞
  7. 【小工具】根据定义的白名单字段进行Bean的拷贝
  8. nuget包管理器控制台下的powershell脚本介绍
  9. L2-001 紧急救援(最短路)
  10. EXCEL调用REFPROP方法
  11. ctfhub(rce智慧树)
  12. CREO:CREO软件之工程图【注释】之尺寸、注解、表面粗糙度、符号、几何公差的简介及其使用方法(图文教程)之详细攻略
  13. 网上书城项目-LoadRunner压力测试
  14. 计算机硬件基础英语ppt,计算机英语 第一单元 计算机硬件 computer hardware.ppt
  15. 开学季||期待和你一同前行
  16. JSPlumb文档翻译
  17. 爬虫第四战爬取糗事百科搞笑段子
  18. Java如何读取和操作上G文本数据
  19. 小米笔记本电脑触摸板失灵解决方案
  20. 基于加取模和循环左移运算的扩散算法matlab

热门文章

  1. GridView里面的Item高度设置
  2. BZOJ2832[AHOI2012] 信号塔
  3. webpack5学习与实战-(九)-区分开发和生产环境的配置
  4. http抓包实践--(四)-http压缩和url encode
  5. C语言文件的存储和处理实验报告,c语言文件处理实验报告(6页)-原创力文档...
  6. java生成有理数_JAVA程序设计-有理数类的设计
  7. 识别数学公式_新品独家发布(免费送码)丨极度公式 数学公式 OCR 识别编辑 LaTeX 公式软件...
  8. mysql replace 只替换第一个_MySQL:replace函数的几种实用场景
  9. android播放器 重音,如何在SQLite查询中忽略重音(Android)
  10. a href 与mysql_详解A标签中href=的几种用法