如今,大多数计算环境更多地是由不同平台组成,而不是固守任何一个平台。 Java 消息服务 (JMS) ,与可扩展标记语言 (XML) 一起,满足了这种异构环境集成的愿望。这篇文章演示了如何使用 JMS 来创建基于 XML 的消息并将这些消息同样分发到 Java 和非 Java 应用程序。
经过几年构建、扩展和维护庞大的分布式应用之后,程序员逐步体会到平台无关的行为和平台无关的数据的好处了。
Java 编程语言已经向满足平台无关的行为(尽管例如 TCL 这样的脚本语言在一段或更长时间内还受到关注)的需要迈进了一步。而且 XML(可扩展标记语言)正在成为开放、平台无关的数据解决方案的中坚力量。
本文演示了在与 Java 消息服务 (JMS) 一起使用的情况下,XML 如何满足平台无关的数据的愿望。
消息传递将它们联系在一起
JMS 为消息服务定义了通用 Java 语言接口。它支持最常见的消息传递模型(包括发布/订阅和点到点)。
首先将平台无关的数据与 Java 技术放在一段文字中提及看起来比较奇怪。然而,既然JMS是一种基于 Java(因此是平台无关的)的技术,我们为什么在使用 JMS 时需要平台无关的数据呢?
答案来源于经常使用消息传递的环境。消息传递的一个最大优点体现在应用集成领域。被集成的应用多半不全是 Java 应用。
在这种情况下 JMS 非常理想,因为它是一种接口规范 -- 而不是实现。这意味着JMS位于已经有了相当的应用现有技术的上面一层。(当然,所有 Java 实现也能利用这种 JMS 和 XML 的解决方案。)
图 1. 位于专有消息服务上层的 JMS
图 1 说明了这样一种环境。非 Java 应用与专用消息服务直接进行通信。Java 应用通过 JMS 通信。每一样是无缝的,对吗?
但不完全是。数据仍然是一个需要解决的问题。
平台无关的数据解决了问题
请考虑 JMS 的五种消息类型。JMS 提供了三种结构化或半结构化的消息类型(MapMessage、ObjectMessage 和 StreamMessage)以及两种非结构化的或自由格式的消息类型(TextMessage 和 BytesMessage)。
结构化的消息格式只代表了众多处理结构化数据方法中的少数几种(只有映射表、序列化对象和数据元素流是直接表示的)。更重要的是,它们引发了与非 Java 应用交互操作的问题。转换或映射,特别是在转换涉及到序列化的类时是如何实现的呢?
非结构化的消息格式似乎能够更好地进行交互操作,但这仅仅是因为它们在消息上很少利用结构。然而这个很小的便利却为每个接受者加重了语法分析和确认的负担。
XML 减轻了这种负担。它为丰富的功能性数据结构提供了清晰的标准化途径,并通过越来越多的工具来支撑它,这些工具是用来执行语法分析和确认这些费力的工作的。
通过在环节中使用 XML,每一样都是无缝的。