You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Keith Wall (JIRA)" <ji...@apache.org> on 2011/02/03 17:20:29 UTC

[jira] Updated: (QPID-3036) java.lang.RuntimeException within a client's onMessage is not handled per the JMS specification.

     [ https://issues.apache.org/jira/browse/QPID-3036?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Keith Wall updated QPID-3036:
-----------------------------

    Attachment: 0001-Test-case-to-demonstrate-QPID-3036.patch

Test case to demonstrate QPID-3036.

The following two test demonstrate the defect exhibited in delivery modes AUTO_ACKNOWLEDGE and DUPS_OK_ACKNOWLEDGE

testAutoAckConsumerWithMessageListenerThatThrowsRuntimeException
testDupsOkayAutoAckConsumerWithMessageListenerThatThrowsRuntimeException

The these two show that CLIENT_ACKNOWLEDGE and SESSION_TRANSACTED
are NOT AFFECTED.

testClientAckConsumerWithMessageListenerThatThrowsRuntimeException
testTransactedSessionConsumerWithMessageListenerThatThrowsRuntimeException


> java.lang.RuntimeException within a client's onMessage is not handled per the JMS specification.
> ------------------------------------------------------------------------------------------------
>
>                 Key: QPID-3036
>                 URL: https://issues.apache.org/jira/browse/QPID-3036
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Client
>    Affects Versions: 0.9
>            Reporter: Keith Wall
>            Priority: Minor
>         Attachments: 0001-Test-case-to-demonstrate-QPID-3036.patch
>
>
> Qpid's handling of RuntimeExceptions (and subclasses) thrown from within a client's MessageListener#onMessage(Message) does not follow the JMS specification.  This defect affects only JMS consumers using asynchronous delivery (via an onMessage callback rather than MessageConsumer#receive()) with delivery modes AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE).
> Delivery modes CLIENT_ACKNOWLEDGE and SESSION_TRANSACTED are NOT affected.
> The JMS specification (Java Message Service, Version 1.1 April 12, 2002) states:
> ======
> 4.5.2 Asynchronous Delivery
> A client can register an object that implements the JMS MessageListener
> interface with a MessageConsumer. As messages arrive for the consumer, the
> provider delivers them by calling the listener's onMessage method.
> It is possible for a listener to throw a RuntimeException; however, this is
> considered a client programming error. Well-behaved listeners should catch
> such exceptions and attempt to divert messages causing them to some form of
> application-specific 'unprocessable message' destination.
> The result of a listener throwing a RuntimeException depends on the session's
> acknowledgment mode.
> * AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE - the message
> will be immediately redelivered. The number of times a JMS provider will
> redeliver the same message before giving up is provider-dependent. The
> JMSRedelivered message header field will be set for a message redelivered
> under these circumstances.
> ======
> Currently, Qpid handles a message that causes onMessage to throw a RuntimeException in the following manner:
> 1) The exception will be logged to the (client) application log:
> Dispatcher-Channel-1 2011-02-03 11:37:43,095 ERROR [apache.qpid.client.BasicMessageConsumer] reNotification : Caught exception (dump follows) - ignoring...
> java.lang.RuntimeException: Rejecting message <xxxxx> at org.apache.qpid.client.MessageListenerRuntimeExceptionHandlingTest$1.onMessage(MessageListenerRuntimeExceptionHandlingTest.java:229)
>         at org.apache.qpid.client.BasicMessageConsumer.notifyMessage(BasicMessageConsumer.java:722)
>         at org.apache.qpid.client.BasicMessageConsumer_0_10.notifyMessage(BasicMessageConsumer_0_10.java:164)
> 2) Subsequent messages continue to be delivered as normal.
> 3) The message that caused the RuntimeException will be not redelivered to the client _until_ the client recreates the MessageConsumer.
> 4) If the message continues to cause the RuntimeException, the message will be redelivered to the client on every client restart (unless message is expired by its time-to-live, persistence, queue durability etc).  

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org