Sun ONE Message Queue 3.0.1 SP2 发行说明

Sun™ ONE Message Queue 发行说明

版本 3.0.1 SP2

部件号 817-3829-10

2003 年 8 月

这些发行说明包含 Sun™ Open Net Environment (Sun ONE) Message Queue 的版本 3.0.1 Service Pack 2 (SP2) 发行时提供的重要信息。本文中阐述了新功能和增强功能、已知的限制和问题、技术说明以及其它信息。请在开始使用 MQ 3.0.1 SP2 前先阅读此文档。

您可以通过以下 Sun ONE 文档 Web 站点获得这些发行说明的最新版本:http://docs.sun.com/?p=/coll/S1_MessageQueue_301。在安装和设置软件之前,请先查看此 Web 站点并在以后定期查看最新发行说明和手册。

这些发行说明包含以下各节:


版本历史记录

表 1 版本历史记录 

日期

更改说明

2003 年 8 月

本文档做了以下更改:

2002 年 10 月

本文档的初始版本


符合 Java™ Message Service (JMS) 规范

MQ 3.0.1 已被证明符合 Java Message Service (JMS) 1.1 规范:它通过了 JMS 1.1 兼容性测试套件 (CTS) 的测试。

MQ 3.0.1(Sun ONE Application Server 7 的本地 JMS 提供程序)也已通过了 Sun ONE Application Server 7(需要符合 JMS 1.0.2b 规范)的 J2EE 1.3.1 CTS 测试。


Message Queue 3.0.1 SP2 的新功能

MQ 3.0.1 SP2 是 MQ 3.0.1 SP1(为说明错误而发行的,不包含新功能)的更新。MQ 3.0.1 SP1 是 MQ 3.0.1 的更新。在这些发行说明中,提到的 3.0.1 版本通常分别指 3.0.1、3.0.1 SP1 和 3.0.1 SP2。

MQ 3.0.1 SP2 产品包含 MQ 3.0 和 3.0.1 的所有新功能,以及其它两项 3.0.1 SP2 功能。

Message Queue 3.0.1 SP2 的新功能

MQ 3.0.1 SP2 与 MQ 3.0.1 相比,包含了两项新功能:

Message Queue 3.0.1 的新功能

MQ 3.0.1 与 MQ 3.0 相比,包含了两项新功能:

Message Queue 3.0 的新功能

MQ 3.0 包含对产品的 2.0 版本 iMQ 2.0(以及 iMQ 2.0,Service Pack 1)所做的大量更改。

这些更改中值得注意的是该产品现有两个版本:平台版和企业版。

平台版  提供基本 JMS 支持,最适合小规模部署和开发环境。

企业版  提供 HTTP/HTTPS 支持、增强的可缩放性和安全功能,最适合大规模部署。

(有关这两个版本的详细信息,请参见对《MQ Administrator's Guide》或《MQ Developer's Guide》的介绍。)

以下有关 MQ 3.0 产品中更改的说明根据其适用性(适用于两个版本还是仅适用于企业版)进行了分类。

适用于企业版和平台版

仅适用于企业版


Message Queue 文档更新

以下 MQ 3.0.1 和 MQ 3.0.1 SP2 文档已经从该产品的 3.0 版进行了更新。您可以通过以下 Sun ONE 文档 Web 站点获得这些已更新的文档:http://docs.sun.com/coll/S1_MessageQueue_301

安装指南

《MQ Installation Guide》已经更新,包含了 MQ 3.0.1 SP2 中的新功能(请参见 Message Queue 3.0.1 SP2 的新功能)。

管理员指南

《MQ Administrator's Guide》已经更新,包含了 MQ 3.0.1 中的更改(请参见 Message Queue 3.0.1 的新功能)。

开发者指南

《MQ Developer's Guide》已经更新,包含了 MQ 3.0.1 中的更改(请参见 Message Queue 3.0.1 的新功能)。


兼容性问题

MQ 3.0.1 版本与 MQ 3.0 完全兼容,并且从 MQ 3.0 升级到 MQ 3.0.1 无需更改代理配置、被管理对象、管理工具或客户机应用程序。

但是,MQ 3.0.1 版本(以下简称 3.0.1)通常与 iMQ 2.0 兼容。特别是,从 iMQ 2.0(或 iMQ 2.0 Service Pack 1)升级到 MQ 3.0.1 时可能需要处理许多问题:

代理兼容性

由于代理属性和持久性存储架构已做了更改,所以 MQ 3.0.1 代理不会与 iMQ 2.0 代理兼容。但是,如表 2 中所示,某些 iMQ 2.0 数据与 MQ 3.0.1 兼容,并且能够在升级到 MQ 3.0.1 时保留下来。从 iMQ 2.0 升级到 MQ 3.0.1 时,您应当考虑以下问题:

被管理对象的兼容性

MQ 3.0.1 管理的对象已经增添了新属性,并且 iMQ 2.0 属性已经被重新命名。所以,从 iMQ 2.0 升级到 MQ 3.0.1 时,您应当考虑以下问题:

管理工具的兼容性

由于重命名了许多文件和目录(特别是将字符串“jmq”替换为“imq”),因此所有 MQ 3.0.1 命令行实用程序、代理属性、被管理对象属性和内部文件名均已更改。所以,从 iMQ 2.0 升级到 MQ 3.0.1 时,您应当考虑以下问题:

客户机的兼容性

从 iMQ 2.0 升级到 MQ 3.0.1 时,您应当考虑以下问题:


已知限制

本节所示的限制根据其适用性(适用于 MQ 3.0.1 企业版和平台版还是仅适用于企业版)进行了分类。

适用于企业版和平台版

仅适用于企业版


已知错误

本节包含 MQ 3.0.1 SP2 发行时已知的更加重要的错误的列表。

有关当前错误、错误的状态和解决方法的列表,Java Developer Connection™ 成员应参见 Java Developer Connection Web 站点上的“Bug Parade”页面。在报告新的错误之前请先检查该页面。尽管这里没有列出所有的 MQ 错误,但如果您想了解是否已报告了某个问题,这里可以作为一个很好的起点。

相关页面:

要报告新的错误或提交功能请求,请发送邮件到 imq-feedback@sun.com

表 3 错误说明 

错误编号

详细信息

4431924

imqadmin:有模式对话可能会进入锁死状态

管理控制台 (imqadmin) 使用应用程序模式的对话。这些对话中的大多数均可以通过与图形用户界面的交互来显式地调出,例如,通过选择“添加代理”菜单项。但是,丢失代理连接也可以显示对话。当打开的对话多于一个时,管理控制台将被锁定。使用“关闭”按钮无法关闭任一有模式对话。

解决方法:使用窗口管理器控件关闭当前对话,即

       - Windows 右上角的“X”按钮

       - Solaris 上的“关闭”窗口管理器菜单项

4449354

在极少数情况下,在调用方法 Session.recoverSession.rollback 时(在单独的线程中),同时调用方法 Connection.stopConnection.startConnection.close 可能会导致意外的消息重新传送顺序。

解决方法:确保通过使用相同线程或通过使用同步来串行化调用上述 Connection... 和 Session... 方法。

4683029

如果值包含空格,则所有 solaris/win 脚本中的 -javahome 选项均不起作用。

MQ 命令和实用程序使用 -javahome 选项来指定要使用的替代 Java 2 兼容的运行时。但是,替代 Java 运行时的路径必须为不包含空格的路径。

包含空格的路径的实例如下:

      Windows:

      C:\jdk 1.4(在 Windows 中,如果整个路径放在引号中,则路径可以包含空格,例如 "C:\jdk 1.4")

      Solaris:

      /work/java 1.4

解决方法:在不包含空格的位置或路径中安装 Java 运行时。

4689962

在日语语言环境中,各种管理实用程序的输出在列中没有正确对齐并且边界太短。

解决方法:无

4703406

不必先调用 connection.start(),QueueBrowser 也应可以工作。

必须先在 Connection 上调用 Connection.start(),QueueBrowser 才能浏览队列。如果无法调用 Connection.start(),QueueBrowser 枚举将在 nextElement() 上阻塞,并最终抛出 java.util. NoSuchElementException。

解决方法:在调用 QueueBrowser.getEnumeration() 之前,先调用 Connection.start()。

4753010

使用服务器 VM 的 Java 进程中本地堆段的无限制增长。

这是一个 Java VM 错误,在快速打开和关闭客户机连接的情况下,它可能会影响代理进程。它可以导致持续的和无限制的代理进程内存增长。当所有系统内存耗尽时,代理最终会崩溃。

您可以使用 /usr/proc/bin/pmap 工具验证本地堆段的增长。

解决方法:使用以下命令选项强制代理使用客户机 VM:

    imqbrokerd -clientvm

或者,您可以删除用于启动代理的 /usr/bin/imqbrokerd shell 脚本中的 -server 参数,或者升级到 JDK 1.4.1 并使用下列命令选项:

    imqbrokerd -javahome JDK_1.4.1_directory

4761626

使用方频繁创建/破坏自动创建队列可能会导致消息丢失。

在少数极端情况下,自动创建的队列目标可能会丢失消息。

如果在从队列传送的所有消息均已被确认之后,正当新的消息生成方(位于不同的连接上)发送一条消息到该队列的时候用户执行了删除队列最后一条消息的使用方的操作,则将发生此错误。这将导致新的消息抵达时,队列被“自动删除”(队列为空,不包含任何使用方),从而导致新的消息丢失。

解决方法:使用 MQ 管理工具以管理方式创建队列。

4879448

当堆填充到 RED 内存状态时,Sun ONE Message Queue Version 3.0.1 不将持久性消息交换到磁盘。

可以使用布尔表达式来确定消息是否具有不正确的逻辑。如果逻辑不正确,则消息应被换出。这意味着在某些情况下,持久性消息将被换出内存。如果关闭了交换非持久性消息的功能,将始终认为持久性消息是正确的。

解决方法:在 config.properties 文件中或通过命令行设置以下代理属性:
imqmemory_management.swapNPMsps=false

4883126

自动重新连接功能运行不正常。

每次自动连接后使用方的数量将增长,这导致代理发送重复消息。

解决方法:无。此错误将在 MQ 3.5 中更正。

4888270

重新传输原先在事务中发送的消息导致代理错误。

如果随后接收到了原先在事务中发送的消息并且在非事务会话中重新传送了相同的消息对象,则代理将报告错误。

解决方法:不使用相同的消息对象。如果确实要重新传送消息,请创建单独的新消息。

4893546

运行 w/jdk1.4.2 和服务器 VM 时,代理不释放内存。

解决方法:使用 clientvm。应使用以下命令启动代理:

imqbrokerd -clientvm


Message Queue 3.0.1 版本中已更正的错误

以下为 MQ 3.0.1、3.0.1 SP1 和 3.0.1 SP2 中已更正的最重要错误的简要说明。

有关 MQ 3.0 中已更正的错误,请参阅可以从以下网址获取的 MQ 3.0 发行说明

有关以下任一已更正错误的详细信息,您可以在以下 Java Developer Connection 站点查阅完整的报告:

表 4 MQ 3.0.1 版本中已更正的错误 

错误编号

说明

4679837

将 TLS 用作传输时,客户机有时在 connection.close() 上抛出 JMSException

4683129

代理日志时间戳在半夜 12 点钟和凌晨 1 点钟之间不正确。

4688051

快速创建和关闭与代理的连接时,客户机可能会出现 EOFException

4694971

即使在正常无错误的 XAConnection.close() 之后,完成单独的 JTS/XA 事务偶尔也可能失败。

4700851

客户机编辑完 XA 事务后未清除本地事务。

4701982

如果设置了 CLASSPATH 环境变量,则管理控制台无法在 Solaris 或 Linux 上启动。

4702152

对于已确认为使用方事务一部分的消息,代理持有每个已确认消息的某些不必要的状态信息,直至使用方关闭。

4704186

实例应用程序 README 文件 (demo/jms/README) 中的修正。

4735757

调用 commit() 之前,如果使用方从一个事务中接收的消息超过 50 个,将抛出异常。

4758424

待办事项消息 > 10k 时,循环队列的性能将下降。

4758427

如果最后进入队列的消息在传送之前过期,循环队列使用方可能会“阻塞”。

4770212

如果连接没有待定消息,暂停和恢复服务可以导致客户机连接挂起。

4770518

Windows 代理服务在退出时终止。

4809079

如果存在基于 SSL 的连接,则代理不能正确关闭。

4821708

Session.createProducer(null) 将抛出 NullPointerException。

4828860

带有选定器的 MQ 的性能将下降 - 随着客户机数量的增加而降低。

4835586

主代理备份 - 恢复循环可能会导致目标信息丢失。

4879448

某些情况下,代理不将信息交换到磁盘。


JMS 中标记为可选的功能

JMS 规范指出了某些项是可选的 - 每个 JMS 提供商(供应商)可以选择是否实现这些项。MQ 产品对这些可选项的处理如下所示:

表 5 可选的 JMS 功能 

JMS 规范中的章节

说明和 MQ 处理

3.4.3
JMSMessageID

“由于创建消息 ID 比较麻烦,并会使消息增大,所以如果某些 JMS 提供程序被提示消息 ID 未被应用程序使用,他们可能能够优化消息的开销。JMS 消息生成方提供了禁用消息 ID 的提示。”

MQ 实现:产品不会禁用消息 ID 生成(在 MessageProducer 中调用的所有 setDisableMessageID() 均将被忽略)。所有消息都将包含有效的 MessageID 值。

3.4.12
覆盖消息标题字段

“JMS 未明确定义管理员如何覆盖这些标题字段值。不要求 JMS 提供程序支持此管理选项。”

MQ 实现:MQ 产品支持通过配置连接工厂管理的对象来以管理方式覆盖消息标题字段的值。

3.5.9
JMS 定义的属性

“JMS 为 JMS 定义的属性保留‘JMSX’属性名称前缀。”
“除非另行说明,否则对这些属性的支持是可选的。”

MQ 实现:MQ 产品支持由 JMS 1.1 规范定义的 JMSX 属性。

3.5.10
针对提供者的属性

“JMS 为针对提供者的属性保留‘JMS_<vendor_name>’属性名称前缀。”

MQ 实现:针对提供者的属性的目的在于为支持提供者本地客户机使用 JMS 提供所需的特殊功能。它们不应该用于 JMS 至 JMS 的信息传送。MQ 3.0.1 不使用针对提供者的属性。

4.4.8
分布式事务

“JMS 不要求提供者支持分布式事务。”

MQ 实现:此版本的 MQ 产品支持分布式事务。

4.4.9
多会话

“对于 PTP <点对点分布模型>,JMS 不为相同的队列指定并行 QueueReceiver 的语义,但 JMS 并不禁止提供者支持此功能。”有关详细信息,请参阅 JMS 规范中的 5.8 节。

MQ 实现:MQ 实现支持三种队列传送策略:故障转移、循环和单个(默认)。有关详细信息,请参见《MQ Administrator's Guide》。


技术说明

本节包含有关以下主题的简短说明:

系统时钟设置

使用 MQ 系统时,同步系统时钟应小心并避免将它们设置为早于当前时间。

建议同步

建议您同步所有与 MQ 系统交互的主机上的时钟。这在使用消息失效期 (TimeToLive) 时尤为重要。未同步主机的时钟可能会导致 TimeToLive 不按预期的方式工作(消息可能无法传送)。您应在启动任何代理之前同步时钟。

Solaris  您可以在本地主机上运行 rdate 命令以与远程主机进行同步。(您必须为超级用户 [即root 用户] 才能运行此命令。)例如,以下命令将本地主机(称为 Host 2)与远程主机 Host1 同步:

Linux  命令类似于 Solaris,但必须提供 -s 选项:

Windows  您可以运行带有时间子命令的网络命令将本地主机与远程主机同步。例如,以下命令将本地主机(称为 Host 2)与远程主机 Host1 同步:

避免将系统时钟设置为早于当前时间

您应避免在运行 MQ 代理的系统上将系统时钟设置为早于当前时间。MQ 使用时间戳来帮助标识诸如事务和长期订阅这样的内部对象。如果系统时钟设置为早于当前时间,理论上有可能生成重复的内部标识符。代理将尝试通过为标识符引入一些随机性以及通过在运行时检测时钟偏差来补偿这种情况,但是如果代理未运行时将系统时钟调整为远远早于当前时间,则会有少量出现标识符重复的可能性。

如果需要在运行代理的系统上将系统时钟设置调整为早于当前时间若干秒钟,建议您在没有事务和长期订阅,或在代理没有运行时执行此操作,然后在代理进行备份之前等候一段时间(时钟偏差的时间)。

不过最理想的方法是在启动任何代理前先同步时钟,然后使用适当的技术确保部署后时钟不会明显出现偏差。

OS 定义的客户机和代理的连接限制

在 Solaris 和 Linux 平台上,客户机或代理在其中运行的 shell 对客户机可以使用的文件描述符的数量进行了不严格的限制。在 MQ 系统中,客户机创建的每个连接,或代理接受的每个连接都使用其中一种文件描述符。因此,如果不更改此限制,Solaris 上代理或客户机运行的连接不能超过 256 个,Linux 上为 1024 个。(由于有些文件描述符要用于其它目的,例如用于基于文件的持久性,所以实际的数量略少于此。)

要更改此限制,请参见 ulimit 手册页或后面所述的增加文件描述符以提高基于文件的持久性性能中的说明。此限制需在客户机或代理要在其中执行的每个 shell 中更改。

增加文件描述符以提高基于文件的持久性性能

在 Solaris 和 Linux 平台上,在默认的基于文件的持久性中存储消息的速度受可用于文件存储的文件描述符数量的影响。(Windows 没有文件描述符限制。)大量描述符使系统可以更快地处理大量的持久性消息。

要提高性能测试或部署的性能,管理员应增大可用于应用程序(在此情况下,为代理进程)的文件描述符的最大数量,然后通过更新属性的值来增加代理使用的共享文件描述符池的大小。

此属性的值必须小于系统中可用的文件描述符的最大数量。

例如,在 Solaris 中,您可以使用 ulimit 命令来增大文件描述符限制。进程将从其父(登录)shell 继承系统限制。在 Solaris 中,存在一个“严格”限制和一个“不严格”限制。对于非 root 用户,应用程序文件描述符的数量不能超过不严格限制,而不严格限制依次不能超过严格限制。

检查当前文件描述符限制的命令:

为“根”用户更改文件描述符限制的命令:

此后,从此 shell 创建的任何进程都可以打开不受限制的文件描述符。所以此时运行 imqbroker 命令是安全的。

为非 root 用户更改文件描述符限制的命令:

其中 number1 小于 1024,number2 小于 number1

如果要大于 1024,您可以使用以下选项:

保护持久性数据安全

代理使用持久性存储,它包含与其它信息一起临时存储的消息文件。由于这些消息可能包含专用信息,所以建议您保护数据存储以防止未授权的访问。

代理可以使用内置的持久性,也可以使用插入的持久性。

内置持久性存储

使用内置持久性的代理将持久性数据写入平面文件数据存储,它位于:

其中 brokerName 为标识代理实例的名称。

第一次启动代理实例时,将创建 brokerName/filestore/ 目录。保护此目录的过程取决于运行代理的操作系统。

Solaris 和 Linux  IMQ_VARHOME/instances/brokerName/filestore/ 目录上的权限取决于启动代理实例的用户的 umask。因此,可以通过适当设置 umask 来限制启动代理实例并读取其持久性文件的权限。或者,管理员(超级用户)可以通过将 IMQ_VARHOME/instances 目录上的权限设为 700 来保护持久性数据。

Windows  可以通过您使用的 Windows 操作系统提供的机制来设置 IMQ_VARHOME/instances/brokerName/filestore/ 目录上的权限。这通常涉及打开目录的属性对话。

插入的持久性存储

使用插入的持久性的代理向 JDBC 兼容数据库写入持久性数据。

对于由数据库服务器(例如 Oracle 数据库)管理的数据库,建议您创建一个用户名和密码来访问 MQ 数据库表(名称以“IMQ”开头的表)。如果数据库不允许保护单个表,请创建一个仅由 MQ 代理使用的专用数据库。请参见数据库供应商提供的文档,以了解如何创建用户名/密码访问。

代理打开数据库连接所需的用户名和密码可以作为代理配置属性提供。但是,启动代理时将它们作为命令行选项提供更为安全(请参见《MQ Administrator's Guide》的附录 A“Setting Up Plugged-in Persistence”)。

对于代理通过数据库的 JDBC 驱动程序(例如 Cloudscape 数据库)直接访问的嵌入式数据库,通常通过在要存储持久性数据的目录上设置文件权限(如以上内置持久性存储中所述)来提供安全性。请确保代理和 imqdbmgr 实用程序都可以读取和写入数据库,但是,两者应由同一用户运行。

代理内存配置

当代理快要耗尽 Java 对象使用的 JVM 堆空间时,它将使用各种技术(如流控制和消息交换)来释放内存。在极端情况下,代理甚至关闭客户机连接以释放内存和减少消息内流。所以最好将最大 JVM 堆空间设置得足够高,以避免这种情况。

但是,与系统的物理内存相比,如果最大 Java 堆空间设置过高,代理将继续增大 Java 堆空间,直至整个系统耗尽内存。这会导致性能的降低、不可预计的代理崩溃和/或影响系统中运行的其它应用程序和服务的行为。

可以通过使用 -Xmx Java 命令行参数配置合理的 Java 堆大小限制来避免此问题。总的说来,估算正常和峰值系统内存足迹,并配置 Java 堆大小,使其足以提供良好性能但又不至于过大而引起系统内存问题,是一种很好的方法。

客户机内存不足错误

如果您运行的是处理较大消息或许多小消息的 JMS 客户机,它可能会遇到 OutOfMemoryError 错误。客户机运行时没有内存泄漏 - 它只是没有足够的内存从网络复制消息并将它们传送给客户机。

要消除这些 OutofMemoryError 错误,请增大最大 Java 堆大小。您可以通过将适当的命令行选项传送给 javajre 命令来执行此操作。

在 Java2 上,在运行客户机应用程序时使用 -Xmx 选项。例如:

请注意以下限制:


如何报告问题

要报告问题,请发送邮件到 imq-feedback@sun.com

如果您签有支持合同并遇到 MQ 问题,请使用以下方法之一联系 Sun ONE 用户支持:

为使我们能够更好地帮助您解决问题,请在联系支持人员时准备好以下信息:


了解详细信息

除了 MQ 文档,您还可以找到如下所述的其它信息。

论坛

Sun ONE 软件论坛

以下网址有一个 Sun ONE MQ 论坛:

Java 技术论坛

Java 技术论坛中有一个您可能感兴趣的 JMS 论坛。

Sun 欢迎您提出宝贵意见

Sun 非常愿意改进其文档,并欢迎您提出意见和建议。请将您的意见通过电子邮件发送到 Sun 的以下地址:

请在主题行中注明文档的部件号 (817-3829-10),并在电子邮件的正文中注明书名(《Message Queue 3.0.1 发行说明》)。


其它 Sun 资源

您可以从以下 Internet 位置找到有用的 Sun ONE 信息:


版权所有 © 2003 Sun Microsystems, Inc。保留所有权利。

Sun、Sun Microsystems、Sun 徽标、Solaris、Java、Java 咖啡杯徽标、JDBC 和 JDBC Compliant 是 Sun Microsystems, Inc. 在美国和其它国家或地区的商标或注册商标。Sun ONE Message Queue 的使用受附带的许可协议中说明条款的限制。