Sun ONE Message Queue 3.0.1 SP2 Release Notes

Sun™ ONE Message Queue Release Notes

Version 3.0.1 SP2

Part Number 817-3731-10

August 2003

These release notes contain important information available at the time of release of Version 3.0.1 Service Pack 2 (SP2), of Sun™ Open Net Environment (Sun ONE) Message Queue (MQ). New features and enhancements, known limitations and problems, technical notes, and other information are addressed here. Read this document before you begin using MQ 3.0.1 SP2.

The most up-to-date version of these release notes can be found at the Sun ONE documentation web site: http://docs.sun.com/?p=/coll/S1_MessageQueue_301. Check the web site prior to installing and setting up your software and then periodically thereafter to view the most up-to-date release notes and manuals.

These release notes contain the following sections:


Revision History

Table 1  Revision History 

Date

Description of Changes

August 2003

The following changes were made to this document:

October 2002

Initial release of this document


Java™ Message Service (JMS) Compliance

MQ 3.0.1 versions have been certified as compliant with the Java Message Service (JMS) 1.1 specification: it has passed the JMS 1.1 Compatibility Test Suite (CTS).

MQ 3.0.1, which is the native JMS provider for Sun ONE Application Server 7, has also passed the J2EE 1.3.1 CTS testing of the Sun ONE Application Server 7 (which requires compliance with JMS 1.0.2b)


What’s New in Message Queue 3.0.1 SP2

MQ 3.0.1 SP2 is an update of MQ 3.0.1 SP1 (which was a bug release with no new features). MQ 3.0.1 SP1 was an update of MQ 3.0.1. In these Release Notes, references to 3.0.1 versions generally mean 3.0.1, 3.0.1 SP1, and 3.0.1 SP2 respectively.

The MQ 3.0.1 SP2 product includes all the new features of MQ 3.0 and 3.0.1, plus two additional 3.0.1 SP2 features.

Features New in Message Queue 3.0.1 SP2

MQ 3.0.1 SP2 includes two new capabilities as compared to MQ 3.0.1:

Features New in Message Queue 3.0.1

MQ 3.0.1 includes two new capabilities as compared to MQ 3.0:

Features New in Message Queue 3.0

MQ 3.0 included a number of changes to Version 2.0 of the product—iMQ 2.0 (and iMQ 2.0, Service Pack 1).

Notable among these changes is that the product is now available in two editions: a Platform Edition and an Enterprise Edition.

Platform Edition     Provides basic JMS support, and is best suited to small-scare deployments and development environments

Enterprise Edition     Provides HTTP/HTTPS support, enhanced scalability, and security features, and is best suited to large-scale deployments.

(See the introduction to the MQ Administrator’s Guide or the MQ Developer’s Guide for more information on these editions.)

The descriptions, below, of changes in the MQ 3.0.1 product are grouped according to whether they apply to both editions or to the Enterprise Edition only.

Both Enterprise and Platform Editions

Enterprise Edition Only


Message Queue Documentation Updates

The following MQ 3.0.1 and MQ 3.0.1 SP2 documents have been updated from Version 3.0 of the product. These updated documents can be found at the Sun ONE documentation web site: http://docs.sun.com/coll/S1_MessageQueue_301.

Installation Guide

The MQ Installation Guide has been updated to include changes to MQ 3.0.1 SP2 (see "Features New in Message Queue 3.0.1 SP2").

Administrator’s Guide

The MQ Administrator’s Guide has been updated to include new features that are in MQ 3.0.1 (see "Features New in Message Queue 3.0.1").

Developer’s Guide

The MQ Developer’s Guide has been updated to include new features that are in MQ 3.0.1 (see "Features New in Message Queue 3.0.1").


Compatibility Issues

MQ 3.0.1 versions are fully compatible with MQ 3.0, and upgrading from MQ 3.0 to MQ 3.0.1 requires no changes in broker configuration, administered objects, administration tools, or client applications.

However, MQ 3.0.1 versions (hereafter in this section simply referred to as 3.0.1) are generally not compatible with iMQ 2.0. In particular, there are a number of issues that you might need to address when upgrading from iMQ 2.0 (or iMQ 2.0 Service Pack 1) to MQ 3.0.1:

Broker Compatibility

An MQ 3.0.1 broker will not inter-operate with an iMQ 2.0 broker due to changes in broker properties and in the persistent store schema. However, some iMQ 2.0 data is compatible with MQ 3.0.1, as shown in Table 2, and can be preserved when upgrading to MQ 3.0.1. When upgrading from iMQ 2.0 to MQ 3.0.1, you should consider the following:

Administered Object Compatibility

MQ 3.0.1 administered objects have been enhanced with new attributes and iMQ 2.0 attributes have been renamed. Therefore, when upgrading from iMQ 2.0 to MQ 3.0.1, you should consider the following:

Administration Tool Compatibility

Because of the renaming of many files and directories (specifically to replace the string “jmq” with “imq”), all MQ 3.0.1 command line utilities, broker properties, administered object attributes, and internal file names have changed. Therefore, when upgrading from iMQ 2.0 to MQ 3.0.1, you should consider the following:

Client Compatibility

When upgrading from iMQ 2.0 to MQ 3.0.1, you should consider the following:


Known Limitations

Limitations shown in this section are grouped according to whether they apply to both Enterprise and Platform Editions of MQ 3.0.1 versions or to the Enterprise Edition only.

Both Enterprise and Platform Editions

Enterprise Edition Only


Known Bugs

This section contains a listing of the more important bugs known at the time of the MQ 3.0.1 SP2 release.

For a list of current bugs, their status, and workarounds, Java Developer Connection (TM) members should see the Bug Parade page on the Java Developer Connection web site. Please check that page before you report a new bug. Although not all MQ bugs are listed here, it is a good starting place if you want to know whether a problem has been reported.

The relevant page is:

To report a new bug or submit a feature request, send mail to imq-feedback@sun.com.

Table 3  Bug Descriptions 

Bug Number

Details

4431924

imqadmin: modal dialogs can get into deadlock situation

The Administration Console (imqadmin) uses dialogs that are application modal. Most of these dialogs are brought up explicitly by interacting with the graphical user interface, for example, by selecting the Add Brokers menu item. However, a dialog can also appear as a result of a lost broker connection. When more than one dialog is open, the Administration Console is locked. You will not be able to dismiss either modal dialog using the Close button.

Workaround: Dismiss the top most dialog using the window manager controls i.e.

       - the 'X' button at the upper right corner on Windows

       - the 'Close' window manager menu item on Solaris

4449354

In extremely rare cases, calling the methods Connection.stop, Connection.start, and Connection.close at the same time as calling the methods Session.recover and Session.rollback (in separate threads) may result in an unexpected message redelivery order.

Workaround: make sure your calls to the Connection… and Session… methods specified above are serialized either by using the same thread or by using synchronization.

4683029

The -javahome option in all solaris/win scripts does not work if the value has a space.

The -javahome option is used by the MQ commands and utilities to specify an alternate Java 2 compatible runtime to use. However, the path to the alternate Java runtime must be located at a path that does not contain spaces.

Examples of paths that have spaces are:

      Windows:

      C:\jdk 1.4 (On Windows the path can contain spaces if the entire path is placed in quotes; for example, “C:\jdk 1.4”)

      Solaris:

      /work/java 1.4

Workaround: Install the Java runtime at a location or path that does not contain spaces.

4689962

In the Japanese locale, the output of various admin utilities is not properly aligned in columns and the borders are too short.

Workaround: None

4703406

QueueBrowser should function without first calling connection.start().

Connection.start() must be called on a Connection before a QueueBrowser can browse a Queue. If you fail to call Connection.start() the QueueBrowser enumeration will block on nextElement(), and eventually throw a java.util. NoSuchElementException.

Workaround: Call Connection.start() before calling QueueBrowser.getEnumeration().

4753010

Unbounded growth in Java process native heap segment with server VM.

This is a Java VM bug that might affect the broker process under conditions of rapid opening and closing of client connections. It can cause continuous and unbounded broker process memory growth. The broker can eventually crash when all the system memory is exhausted.

You can verify the growth of the native heap segment using the /usr/proc/bin/pmap tool.

Workaround: Force the broker to use the client VM, using the following command option:

    imqbrokerd -clientvm

or you can remove the -server argument to the /usr/bin/imqbrokerd shell script that starts the broker, or you can upgrade to JDK 1.4.1 and use the following command option:

    imqbrokerd -javahome JDK_1.4.1_directory

4761626

Heavy consumer creation/destruction w/ autocreate queues can cause message loss

In rare stress situations it is possible for a message to be lost from an auto-created queue destination.

The error will occur if, after all messages delivered from the queue have been acknowledged, the queue’s last message consumer is removed at the same time a new message producer (on a different connection) sends a message to that queue. What happens is that the queue is “auto-removed” (it is empty without any consumers) just as the new message arrives, causing the new message to be lost.

Workaround: Create queues administratively using MQ administration tools.

4879448

Sun ONE Message Queue Version 3.0.1 is not swapping persistent messages to disk when the heap fills to RED memory states.

There is a boolean expression that determines if a message has incorrect logic. If the logic is incorrect, then the message should be swapped out. This means that in some cases, persistent messages will be swapped out of memory. If the ability to swap non-persistent messages is turned off it always evaluates correctly for persistent messages

Workaround: Set the following broker property in either the config.properties file or through the command line:
imqmemory_management.swapNPMsps=false

4883126

The Auto-reconnect feature does not work properly.

The number of consumers grows after each auto-reconnect which causes the broker to send duplicate messages.

Workaround: None. This bug will be fixed in MQ 3.5.

4888270

Re-transmitting a message originally sent in a transaction causes Broker Error

  If a message that was originally sent in a transaction is   subsequently received and the same message object is re-transmitted in a non-transacted session, then the broker reports an error.

  Workaround: Do not use the same message object. Rather make a separate,   new message when you really want to re-transmit the message.

4893546

Broker does not release memory when running w/jdk1.4.2 and server vm

Workaround: Use the clientvm. The broker should be started using the following command:

imqbrokerd -clientvm


Bugs Fixed in Message Queue 3.0.1 Versions

Below is a short description of the most important bugs fixed in MQ 3.0.1, 3.0.1 SP1, and 3.0.1 SP2.

For bugs fixed in MQ 3.0, see the MQ 3.0 Release Notes available at

For more details about any of the following bug fixes you can view the complete report at the Java Developer Connection site:

Table 4  Bugs Fixed in MQ 3.0.1 versions 

Bug Number

Description

4679837

Client sometimes throws JMSException on connection.close() when TLS is used as transport.

4683129

Broker log timestamp is incorrect between midnight and 1am.

4688051

Client can get an EOFException when rapidly creating and closing connections to the broker.

4694971

Standalone JTS/XA transaction completion may fail occasionally, even after a normal, error-free XAConnection.close().

4700851

Client does not clean up local transaction after ending an XA transaction

4701982

The Administration Console cannot be launched on Solaris or Linux if the CLASSPATH environment variable is set

4702152

For messages acknowledged as part of a consumer-side transaction, broker holds on to some unnecessary state information for each acknowledged message until the consumer is closed.

4704186

Corrections in the example applications README file (demo/jms/README)

4735757

A consumer will throw an exception if more than 50 messages are received in a transaction prior to calling commit().

4758424

Performance degrades on round-robin queue when > 10k message backlog.

4758427

Round-robin queue consumers can get “stuck” if the last queued message expires prior to delivery.

4770212

Pausing and resuming a service causes client connections to hang if the connections have no pending messages.

4770518

Windows broker service terminates on logout.

4809079

The broker does not shut down properly if there are SSL based connections.

4821708

Session.createProducer(null) throws NullPointerException.

4828860

MQ performance degrades with selector - gets worse as # of clients increases.

4835586

Master broker backup - restore cycle can cause loss of destination information.

4879448

Under certain circumstances the broker will not swap messages to disk.


Functionality Marked as Optional in JMS

The JMS specification indicates certain items that are optional-- each JMS provider (vendor) chooses whether or not to implement them. The MQ product handling of each of these optional items is indicated below:

Table 5  Optional JMS Functionality 

Section in JMS Specification

Description and MQ Handling

3.4.3
JMSMessageID

“Since message ID’s take some effort to create and increase a message’s size, some JMS providers may be able to optimize message overhead if they are given a hint that message ID is not used by an application. JMS Message Producer provides a hint to disable message ID.”

MQ implementation: Product does not disable Message ID generation (any setDisableMessageID() call in MessageProducer is ignored). All messages will contain a valid MessageID value.

3.4.12
Overriding Message Header Fields

“JMS does not define specifically how an administrator overrides these header field values. A JMS provider is not required to support this administrative option.”

MQ implementation: The MQ product supports administrative override of the values in message header fields through configuration of connection factory administered objects.

3.5.9
JMS Defined Properties

“JMS Reserves the ’JMSX’ Property name prefix for JMS defined properties.”
“Unless noted otherwise, support for these properties is optional.”

MQ implementation: The JMSX properties defined by the JMS 1.1 specification are supported in the MQ product.

3.5.10
Provider-specific Properties

“JMS reserves the ’JMS_<vendor_name>’ property name prefix for provider-specific properties.”

MQ implementation: The purpose of the provider-specific properties is to provide special features needed to support JMS use with provider-native clients. They should not be used for JMS to JMS messaging. MQ 3.0.1 does not use provider-specific properties.

4.4.8
Distributed Transactions

“JMS does not require that a provider support distributed transactions.”

MQ implementation: Distributed transactions are supported in this release of the MQ product.

4.4.9
Multiple Sessions

“For PTP <point-to-point distribution model>, JMS does not specify the semantics of concurrent QueueReceivers for the same queue; however, JMS does not prohibit a provider from supporting this.” See section 5.8 of the JMS specification for more information.

MQ implementation: The MQ implementation supports three queue delivery policies: Failover, Round Robin, and Single (default). For more information, refer to the MQ Administrator’s Guide.


Technical Notes

This section contains short write-ups on the following topics:

System Clock Settings

When using an MQ system, you should be careful to synchronize system clocks and avoid setting them backward.

Synchronization Recommended

It is recommended that you synchronize the clocks on all hosts interacting with the MQ system. This is particularly important if you are using message expiration (TimeToLive). Failure to synchronize the hosts’ clocks may result in TimeToLive not working as expected (messages may not be delivered). You should synchronize clocks before starting any brokers.

Solaris     You can issue the rdate command on a local host to synchronize with remote host. (You must be superuser--that is, root--to run this command.) For example, the following command synchronizes the local host (call it Host 2) with remote host Host1:

Linux     The command is similar to Solaris, but you must provide the -s option:

Windows     you can issue the net command with the time subcommand to synchronize your local host with a remote host. For example, the following command synchronizes the local host (call it Host 2) with remote host Host1:

Avoid Setting System Clocks Backwards

You should avoid setting the system clock backwards on systems running an MQ broker. MQ uses timestamps to help identify internal objects such as transactions and durable subscriptions. If the system clock is set backwards it is theoretically possible that a duplicate internal identifier can be generated. The broker attempts to compensate for this by introducing some randomness to identifiers and by detecting clock shift when running, but if the system clock is shifted backwards by a significant amount when a broker is not running, then there is a slight risk of identifier duplication.

If you need to set the system clock backwards on a system running a broker by more than a few seconds, it is recommended that you either do it when there are no transactions or durable subscriptions, or do it when the broker is not running, then wait the amount of time you have shifted the clock before bringing the broker back up.

But the ideal approach is to synchronize clocks before starting up any brokers, and then use an appropriate technique to ensure that clocks don't drift significantly after deployment.

OS-Defined Connection Limitations on Clients and Brokers

On the Solaris and Linux platforms, the shell in which the client or broker is running places a soft limit on the number of file descriptors that a client can use. In the MQ system, each connection a client makes, or each connection a broker accepts, uses one of these file descriptors. As a result, you cannot have a broker or client running with more than 256 connections on Solaris or 1024 on Linux without changing this limit. (The number is actually slightly lower than that due to file descriptors that are used for other purposes, such as for file-based persistence.)

To change this limit, see the ulimit man page or the instructions under "Increasing File Descriptors to Improve File-based Persistence Performance," below. The limit needs to be changed in each shell in which a client or broker will be executing.

Increasing File Descriptors to Improve File-based Persistence Performance

On the Solaris and Linux platforms, the speed of storing messages in the default file-based persistence is affected by the number of file descriptors available for use by the file store. (Windows does not have a file descriptor limit.) A large number of descriptors will allow the system to process large numbers of persistent messages faster.

To improve performance for performance testing or deployment, administrators should increase the maximum number of file descriptors available to an application (in this case, the broker process) and then increase the size of the shared file descriptor pool used by the broker by updating the value of the property:

The value of this property must be less than the maximum number of file descriptors available on your system.

On Solaris, for example, you can increase the file descriptor limits using the ulimit command. Processes inherit system limits from their parent (login) shell. On Solaris, there is a “hard” limit and a “soft” limit. For a non-root user, the number of file descriptors for an application cannot exceed the soft limit, which, in turn, cannot exceed the hard limit.

To check the current file descriptor limits:

To change the file descriptor limits for “root” user:

After this, any process created from this shell will be able to open unlimited file descriptors. So it is safe to run the imqbroker command at this point.

To change the file descriptor limit for non-root user:

where number1 is less than 1024, and number2 is less than number1.

If 1024 is not enough, you have the following options:

Securing Persistent Data

The broker uses a persistent store that can contain, among other information, message files that are being temporarily stored. Since these messages might contain proprietary information, it is recommended that the data store be secured against unauthorized access.

A broker can use either the built-in or plugged-in persistence.

Built-in Persistent Store

A broker using built-in persistence writes persistent data to a flat file data store located at:

where brokerName is a name identifying the broker instance.

The brokerName/filestore/ directory is created when the broker instance is started for the first time. The procedure for securing this directory depends on the operating system on which the broker is running.

Solaris and Linux     The permissions on the IMQ_VARHOME/instances/brokerName/filestore/ directory depend on the umask of the user that started the broker instance. Hence, permission to start a broker instance and to read its persistent files can be restricted by appropriately setting the umask. Alternatively, an administrator (superuser) can secure persistent data by setting the permissions on the IMQ_VARHOME/instances directory to 700.

Windows     The permissions on the IMQ_VARHOME/instances/brokerName/filestore/ directory can be set using the mechanisms provided by the Windows operating system that you are using. This generally involves opening a properties dialog for the directory.

Plugged-in Persistent Store

A broker using plugged-in persistence writes persistent data to a JDBC Compliant database.

For a database managed by a database server (for example, an Oracle database), it is recommended that you create a user name and password to access the MQ database tables (tables whose names start with “IMQ”). If the database does not allow individual tables to be protected, create a dedicated database to be used only by MQ brokers. See the database vendor for documentation on how to create user name/password access.

The user name and password required to open a database connection by a broker can be provided as broker configuration properties. However it is more secure to provide them as command line options when starting up the broker (see MQ Administrator’s Guide, Appendix A, “Setting Up Plugged-in Persistence”).

For an embedded database that is accessed directly by the broker via the database's JDBC driver (for example, a Cloudscape database), security is usually provided by setting file permissions (as described in "Built-in Persistent Store," above) on the directory where the persistent data will be stored. To ensure that the database is readable and writable by both the broker and the imqdbmgr utility, however, both should be run by the same user.

Broker Memory Configuration

When the broker gets close to exhausting the JVM heap space used by Java objects, it uses various techniques such as flow control and message swapping to free memory. Under extreme circumstances it even closes client connections in order to free the memory and reduce the message inflow. Hence it is desirable to set the maximum JVM heap space high enough to avoid such circumstances.

However, if the maximum Java heap space is set too high, in relation to system physical memory, the broker can continue to grow the Java heap space until the entire system runs out of memory. This can result in diminished performance, unpredictable broker crashes, and/or affect the behavior of other applications and services running on the system.

This problem can be avoided by configuring a sensible Java heap size limit using the -Xmx Java command line argument. In general it is a good idea to evaluate the normal and peak system memory footprints, and configure the Java heap size so that it is large enough to provide good performance, but not so large as to risk system memory problems.

Client Out of Memory Errors

If you are running a JMS client that deals with large messages or many small messages, it may encounter OutOfMemoryError errors. The client runtime does not have a memory leak--it just has insufficient memory to copy the messages off the network and deliver them to your client.

To eliminate these OutofMemoryError errors, increase the maximum Java heap size. You can do this by passing the appropriate command line option to the java or jre command.

On Java2, use the -Xmx option when running the client application. For example:

Please note these limitations:


How to Report Problems

To report a problem, send mail to imq-feedback@sun.com.

If you have a support contract and you have problems with MQ, contact Sun ONE customer support using one of the following mechanisms:

So that we can best assist you in resolving problems, please have the following information available when you contact support:


For More Information

Beyond the MQ documentation, you can find additional information as indicated below.

Discussion Forums

Sun ONE Software Forum

There is a Sun ONE MQ forum available at the following location:

Java Technology Forum

There is a JMS forum in the Java Technology Forums that might be of interest.

Sun Welcomes Your Comments

Sun is interested in improving its documentation and welcomes your comments and suggestions. Email your comments to Sun at this address:

Please include the part number (817-3731-10) of the document in the subject line and the book title (Message Queue 3.0.1 Release Notes) in the body of your email.


Additional Sun Resources

Useful Sun ONE information can be found at the following Internet locations:


Copyright © 2003 Sun Microsystems, Inc. All rights reserved.

Sun, Sun Microsystems, the Sun logo, Solaris, Java, the Java Coffee Cup logo, JDBC, and JDBC Compliant are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. Use of Sun ONE Message Queue is subject to the terms described in the license agreement accompanying it.