THE WMQ JAVA CLIENT THROWS A MQRC 2010 WHEN THE SPECIFIED BUFFERLENGTH IS LARGER THAN MAXMSGL ON THE CHANNEL - Middleware News
THE WMQ JAVA CLIENT THROWS A MQRC 2010 WHEN THE SPECIFIED BUFFERLENGTH IS LARGER THAN MAXMSGL ON THE CHANNEL - Middleware News
Error description
* If a WebSphere MQ classes for Java client specifies a
BufferLength value on a MQGET call that is larger than the
value that is defined for the MaxMsgLength (MAXMSGL) on the
channel, then it must result in a reason code of 2010
MQRC_DATA_LENGTH_ERROR and the message must remain on the
queue.
The V6 WebSphere MQ classes for Java Client allows the
application to receive the message from the queue. Although the
2010 error is thrown in the V6 client, it is consumed
internally and a second MQGET is performed with the
BufferLength reduced to a value equal to the channel's
MaxMsgLength. This means only a portion of the
message is delivered to the application and the rest of the
data is lost if MQGMO_ACCEPT_TRUNCATED_MSG option has been used
in the MQGMO structure.
Under similar circumstances, a V7.0 WebSphere MQ classes for
Java client also results in a 2010 error to be thrown and
consumed internally. After the 2010 is consumed internally, a
second MQGET is performed, but with the BufferLength reduced to
a zero(0) size. The V7.0 WebSphere MQ classes for Java then
provides the receiving application a 0 bytes length message,
and a 2079 MQRC_TRUNCATED_MSG_ACCEPTED exception:
com.ibm.mq.MQException: MQJE001: Completion Code '1', Reason
'2079'.
Local fix
* Here are 3 ways to avoid this problem:
1. Specify a Buffer Length value that is less than the MAXMSGL
property of the channel.
2. Increase the MAXMSGL property on the channel to a value
greater than the BufferLength specified in the get() call.
3. Do not use the MQGMO_ACCEPT_TRUNCATED_MSG option in the
MQGMO structure.
Problem summary
****************************************************************
USERS AFFECTED:
This issue affects users of the WebSphere MQ classes for Java
(both V6 and V7.0) who do a get() with
MQGMO_ACCEPT_TRUNCATED_MSG and BufferLength specified, and with
the MAXMSGL on the channel set to a value less than this
bufferLength size.
Platforms affected:
All Distributed (iSeries, all Unix and Windows) +Java
****************************************************************
PROBLEM SUMMARY:
When a WebSphere MQ classes for Java application performed a
get() with MQGMO_ACCEPT_TRUNCATED_MSG and BufferLength
specified, when the specified BufferLength was greater than the
MAXMSGL size defined on the channel, then the following
occurred:
(a) The V6 WebSphere MQ classes for Java client performed a
second MQGET to retrieve the message of length only up to
the channel's MAXMSGL value.
(b) The V7.0 WebSphere MQ classes for Java client performed a
second MQGET to retrieve a message of 0 bytes in length.
This resulted in the application receiving:
in case (a): A part of the message which was smaller than the
specified BufferLength
in case (b): A zero-byte length message
In both cases, this resulted in the application not being
provided with the full message, as stored on the the queue, and
with the message getting removed from the queue.
Problem conclusion
* The following changes have been made to the client code:
(a) When the specified BufferLength is greater than the
MaxMsgLength on the channel, the V6 WebSphere MQ classes for
Java client has been changed so that the user can now configure
the client classes to provide the application with a
MQCC_FAILED and MQRC_DATA_LENGTH_ERROR error codes, and prevent
the client from receiving the message.
This fix introduces a new system property called:
com.ibm.mq.alertAboutDataLengthError
This property can be set by passing it as a JVM argument, for
example:
java -Dcom.ibm.mq.alertAboutDataLengthError=true MyApplication
The default value of alertAboutDataLengthError is false, which
retains the client behaviour prior to this code change.
When com.ibm.mq.alertAboutDataLengthError=true is defined, the
V6 WebSphere MQ classes for Java informs the application of
the problem using a MQRC_DATA_LENGTH_ERROR code, and does not
allow the application to remove the message from the queue.
When com.ibm.mq.alertAboutDataLengthError=false, the V6
WebSphere MQ classes for Java behaves as before. The client
allows the application to receive the message from the queue.
Although the 2010 error is thrown in the V6 client, it is
consumed internally and a second MQGET is performed with the
BufferLength reduced to a value equal to the channel's
MaxMsgLength. This removes the message from the queue, with
the client application receiving only a portion of the message,
limited by the size of MaxMsgLength.
(b) When the specified BufferLength is greater than the
MaxMsgLength on the channel, the V7.0 WebSphere MQ classes for
Java will hereby inform the application using MQCC_FAILED and
MQRC_DATA_LENGTH_ERROR, and not allow it to receive the message
from the queue. There is no property which can override this
behaviour.
Error description
* If a WebSphere MQ classes for Java client specifies a
BufferLength value on a MQGET call that is larger than the
value that is defined for the MaxMsgLength (MAXMSGL) on the
channel, then it must result in a reason code of 2010
MQRC_DATA_LENGTH_ERROR and the message must remain on the
queue.
The V6 WebSphere MQ classes for Java Client allows the
application to receive the message from the queue. Although the
2010 error is thrown in the V6 client, it is consumed
internally and a second MQGET is performed with the
BufferLength reduced to a value equal to the channel's
MaxMsgLength. This means only a portion of the
message is delivered to the application and the rest of the
data is lost if MQGMO_ACCEPT_TRUNCATED_MSG option has been used
in the MQGMO structure.
Under similar circumstances, a V7.0 WebSphere MQ classes for
Java client also results in a 2010 error to be thrown and
consumed internally. After the 2010 is consumed internally, a
second MQGET is performed, but with the BufferLength reduced to
a zero(0) size. The V7.0 WebSphere MQ classes for Java then
provides the receiving application a 0 bytes length message,
and a 2079 MQRC_TRUNCATED_MSG_ACCEPTED exception:
com.ibm.mq.MQException: MQJE001: Completion Code '1', Reason
'2079'.
Local fix
* Here are 3 ways to avoid this problem:
1. Specify a Buffer Length value that is less than the MAXMSGL
property of the channel.
2. Increase the MAXMSGL property on the channel to a value
greater than the BufferLength specified in the get() call.
3. Do not use the MQGMO_ACCEPT_TRUNCATED_MSG option in the
MQGMO structure.
Problem summary
****************************************************************
USERS AFFECTED:
This issue affects users of the WebSphere MQ classes for Java
(both V6 and V7.0) who do a get() with
MQGMO_ACCEPT_TRUNCATED_MSG and BufferLength specified, and with
the MAXMSGL on the channel set to a value less than this
bufferLength size.
Platforms affected:
All Distributed (iSeries, all Unix and Windows) +Java
****************************************************************
PROBLEM SUMMARY:
When a WebSphere MQ classes for Java application performed a
get() with MQGMO_ACCEPT_TRUNCATED_MSG and BufferLength
specified, when the specified BufferLength was greater than the
MAXMSGL size defined on the channel, then the following
occurred:
(a) The V6 WebSphere MQ classes for Java client performed a
second MQGET to retrieve the message of length only up to
the channel's MAXMSGL value.
(b) The V7.0 WebSphere MQ classes for Java client performed a
second MQGET to retrieve a message of 0 bytes in length.
This resulted in the application receiving:
in case (a): A part of the message which was smaller than the
specified BufferLength
in case (b): A zero-byte length message
In both cases, this resulted in the application not being
provided with the full message, as stored on the the queue, and
with the message getting removed from the queue.
Problem conclusion
* The following changes have been made to the client code:
(a) When the specified BufferLength is greater than the
MaxMsgLength on the channel, the V6 WebSphere MQ classes for
Java client has been changed so that the user can now configure
the client classes to provide the application with a
MQCC_FAILED and MQRC_DATA_LENGTH_ERROR error codes, and prevent
the client from receiving the message.
This fix introduces a new system property called:
com.ibm.mq.alertAboutDataLengthError
This property can be set by passing it as a JVM argument, for
example:
java -Dcom.ibm.mq.alertAboutDataLengthError=true MyApplication
The default value of alertAboutDataLengthError is false, which
retains the client behaviour prior to this code change.
When com.ibm.mq.alertAboutDataLengthError=true is defined, the
V6 WebSphere MQ classes for Java informs the application of
the problem using a MQRC_DATA_LENGTH_ERROR code, and does not
allow the application to remove the message from the queue.
When com.ibm.mq.alertAboutDataLengthError=false, the V6
WebSphere MQ classes for Java behaves as before. The client
allows the application to receive the message from the queue.
Although the 2010 error is thrown in the V6 client, it is
consumed internally and a second MQGET is performed with the
BufferLength reduced to a value equal to the channel's
MaxMsgLength. This removes the message from the queue, with
the client application receiving only a portion of the message,
limited by the size of MaxMsgLength.
(b) When the specified BufferLength is greater than the
MaxMsgLength on the channel, the V7.0 WebSphere MQ classes for
Java will hereby inform the application using MQCC_FAILED and
MQRC_DATA_LENGTH_ERROR, and not allow it to receive the message
from the queue. There is no property which can override this
behaviour.
Comments
Post a Comment