Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?

最近几年,开发人员可以更广泛地得到企业消息排队(MQ)产品。适当地使 用 MQ 技术经常可以改善应用程序的组织、性能和可伸缩性。Java 消息服务 (Java Message Service (JMS))是集成到 J2EE 中的一部分,它使得 MQ 服务 可以为任何 J2EE 应用程序所用。在本文(也是本专栏系列的第一部分)中, Brian 概述了在 Java 应用程序中使用消息排队的一些好处,并探讨了能够从 MQ 技术中获益最大的问题类型。请在 论坛上(或者通过单击本文顶部或底部的 讨论)同作者及其他读者分享您对本文的想法。

消息排队(MQ)工具没有数据库工具(例如关系(SQL)数据库)为人所知或 为人理解,数据库工具是几乎所有企业应用程序和大量比较简单的应用程序中的 关键组件。开发人员总是可以采用多种类型的数据产品,其范围包括从廉价的、 只能在台式机上使用的数据库(例如 dBase 或 Microsoft Access),到工作组 数据库服务器(例如 Sybase SQL/Anywhere),再到企业数据库服务器(例如 DB2 或 Oracle)。无论您的项目是什么样子的,总有一个价格、性能及功能都 适合的数据库产品可供您使用。

和数据库相似,MQ 产品有时被称为面向消息的中间件(MOM),已经出现相 当一段时间了。然而,直到最近,MQ 服务器还一直是昂贵的、只能被资金最充 足的企业开发人员所用的高端产品。结果,只有非常少的开发人员可以享受在其 应用程序中使用消息传递所带来的好处。

大众化的消息排队

幸运的是,这一状况正在开始改变;现在市场上已经出现了几种价格较低的 MQ 服务器。1997 年,Microsoft 发布了 MSMQ,它是一个事务性消息排队产品 ,作为 Windows NT Server 中的集成部分 ― 无需额外的许可费用。Sun 将 JMS API 包括在最初的 J2EE 规范中,这极大地促进了消息传递的大众化。在 J2EE 规范的版本 1.3 中,所有的 J2EE 容器都要求包含 JMS 提供程序 (provider)。

JMS,也就是 Java 消息服务,它是一种允许 Java 应用程序通过标准化的接 口访问范围广泛的 MQ 服务器(或者,按照 JMS 的说法,是提供程序)的 API ,就象 JDBC 允许程序通过一个公共接口访问许多不同的数据库服务器一样。大 多数 J2EE 容器包含 JMS 提供程序;将来,所有 J2EE 容器都将包含 JMS 提供 程序。没有 J2EE 容器也可以使用 JMS;市场上有几种独立的 JMS 提供程序实 现。此外,EJB 2.0 规范引入了一种新的 EJB 类型 ― 消息驱动 bean ― 它使 得创建利用实体和会话 bean 的消息驱动的组件非常容易。

既然我们都可以使用 JMS 服务,我们就应该学会在应用程序中使用消息传递 的能力。Willy Farrell 是 IBM 的一名电子商务设计师,他写了一本优秀的关 于使用 JMS 的介绍性教程(参阅 参考资料)。它涉及创建消息和队列的基本知 识,以及对消息划分优先级、检索消息和编码消息的所有选项。

消息传递和数据库起了相互补充的作用,在许多情况下,同时使用消息传递 和关系数据库可以产生比只使用它们中的一个好得多的解决方案。

历史上,曾经将 MQ 服务器用于面向事件的应用程序(例如财务服务应用程 序)或者作为一种与完全不同的系统进行相互操作的方式(例如连接完全不同的 数据库应用程序或将一个企业同另一个在供应链网络中的企业相连接)。术语“ 面向消息的中间件”经常应用于 MQ 服务器,它强调 MQ 技术主要用途是连接完 全不同的系统。然而,随着 MQ 产品成本的降低,许多其它应用程序现在也可以 从消息排队中获益。

MQ 服务器做什么?

用 MQ 的说法,消息只是一个字节流(这个字节流可以是一个 XML 文档、一 个序列化的 Java 对象、一个文本字符串或甚至是一条空消息)。对消息的解释 留给应用程序域来做;MQ 基础结构不对消息施加任何语义和结构限制。消息存 储在队列里,MQ 服务器允许您将消息加入到队列以及从队列中取走消息。

到目前为止,消息队列听起来很象简单的链表。从其最简单形式来说,的确 是这样的,但是企业 MQ 服务器通过将一些功能特性封装进这一链表管理而增强 了其功能:

控制谁可以向队列中写以及谁可以从队列中读的安全性

网络接口,它允许消息生产者和消费者位于不同的地方

事务性支持,这样入队和出队操作都具有事务特性:原子性、一致性、隔离 性以及可持久性

分布式事务支持,这样队列操作可以同其它资源管理器(如 SQL 数据库)一 起参加分布式事务

持久存储性

负载均衡

故障转移

管理

时间: 2024-12-31 07:18:27

Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?的相关文章

Java理论与实践专题

Java理论与实践: JDK 5.0中更灵活.更具可伸缩性的锁定机制 Java理论和实践: 一个有缺陷的微基准的剖析 Java理论和实践: 理解JTS ― 平衡安全性和性能 Java理论和实践: 理解JTS ― 幕后魔术 Java理论和实践: 安全构造技术 Java理论与实践: 平衡测试,第3部分:用方面检验设计约束 Java理论与实践:平衡测试,第2部分:编写和优化bug检测器 Java理论与实践:平衡测试,第1部分:不要仅编写测试,还要编写bu Java理论与实践: 您的小数点到哪里去了?

Java理论与实践: 构建一个更好的HashMap

ConcurrentHashMap 是 Doug Lea的 util.concurrent 包的一部分,它提供 比Hashtable 或者 synchronizedMap 更高程度的并发性.而且,对于大多数成 功的 get() 操作它会设法避免完全锁定,其结果就是使得并发应用程序有着非 常好的吞吐量.这个月,BrianGoetz 仔细分析了 ConcurrentHashMap的代码, 并探讨 Doug Lea 是如何在不损失线程安全的情况下取得这么骄人成绩的. 在7月份的那期 Java理论与实践

Java理论与实践: 垃圾收集简史

Java 语言可能是使用最广泛的依赖于垃圾收集的编程语言,但是它并不是第 一个.垃圾收集已经成为了包括 Lisp.Smalltalk.Eiffel.Haskell.ML. Scheme和 Modula-3 在内的许多编程语言的一个集成部分,并且从 20 世纪 60 年代早期就开始使用了.在 Java 理论与实践的本篇文章中,Brian Goetz 描述 了垃圾收集最常用的技术. 垃圾收集的好处是无可争辩的 ―― 可靠性提高.使内存管理与类接口设计 分离,并使开发者减少了跟踪内存管理错误的时间.著

Java 理论与实践:变还是不变?

不变对象具有许多能更方便地使用它们的特性,包括不严格的同步需求和不必考虑数据讹误就能自由地共享和高速缓存对象引用.尽管不变性可能未必对于所有类都有意义,但大多数程序中至少有一些类将受益于不可变.在本月的 Java 理论与实践中,Brian Goetz 说明了不变性的一些长处和构造不变类的一些准则.请在附带的论坛中与作者和其他读者分享您关于本文的心得.(也可以单击文章顶部或底部的"讨论"来访问论坛.) 不变对象是指在实例化后其外部可见状态无法更改的对象.Java 类库中的 String.

Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

伸缩 内容: synchronized 快速回顾 对 synchronized 的改进 比较 ReentrantLock 和 synchronized 的可伸缩性 条件变量 这不公平 结束语 参考资料 关于作者 对本文的评价 相关内容: Java 理论与实践 系列 Synchronization is not the enemy Reducing contention IBM developer kits for the Java platform (downloads) 订阅: develop

Java理论与实践: 您的小数点到哪里去了?

许多程序员在其整个开发生涯中都不曾使用定点或浮点数,可能的例外是, 偶尔在计时测试或基准测试程序中会用到.Java语言和类库支持两类非整数类型 ― IEEE 754 浮点( float 和 double ,包装类(wrapper class)为 Float 和 Double ),以及任意精度的小数( java.math.BigDecimal ).在本月的 Java 理论和实践中,Brian Goetz 探讨了在 Java 程序中使用非整数类型时一 些常碰到的陷阱和"gotcha". 虽

Java理论与实践: 消除bug

很多有关编程风格的建议都是为了创建高质量.可维护的代码,这很合理, 因为最容易修复 bug 的时间就是在产生 bug 之前(少量的预防措施--).遗 憾的是,只预防往往是不够的,虽然有一些精巧的工具可以帮助您创建好的代码 ,但是很少有工具可以帮助您分析.维护或提高现有代码的质量. 写线程安全的类很难,而分析现有类的线程安全性更难,增强类使其仍然保 持线程安全也很难.以隐含假定.不变式以及预期用例(虽然在开发人员的头脑 中很清晰,但是没有以设计笔记.注释或者文档的方式记录下来)的方式编写完 类之后

Java理论与实践: 修复Java内存模型,第1部分

活跃了将近三年的 JSR 133,近期发布了关于如何修复 Java 内存模型 (Java Memory Model, JMM)的公开建议.原始 JMM 中有几个严重缺陷,这导 致了一些难度高得惊人的概念语义,这些概念原来被认为很简单,如 volatile .final 以及 synchronized.在这一期的 Java 理论与实践 中,Brian Goetz 展示了如何加强 volatile 和 final 的语义,以修复 JMM.这些更改有些已经 集成在 JDK 1.4 中:而另一些将会包含

Java理论与实践:做个好的(事件)侦听器

观察者模式在 Swing 开发中很常见,在 GUI 应用程序以外的场景中,它对 于消除组件的耦合性也非常有用.但是,仍然存在一些侦听器登记和调用方面的 常见缺陷.在 Java 理论与实践 的这一期中,Java 专家 Brian Goetz 就如何 做一个好的侦听器,以及如何对您的侦听器也友好,提供了一些感觉很好的建议 .请在相应的 讨论论坛 上与作者和其他读者分享您对这篇文章的想法.(您也 可以单击本文顶部或底部的 讨论 访问论坛.) Swing 框架以事件侦听器的形式广泛利用了观察者模式(也称