MessageConsumer does not Rollback on Exception
----------------------------------------------

                 Key: AMQNET-335
                 URL: https://issues.apache.org/jira/browse/AMQNET-335
             Project: ActiveMQ .Net
          Issue Type: Bug
          Components: ActiveMQ
            Reporter: Rasitha Wijesinghe
            Assignee: Jim Gomes


For modes of AutoAcknowledgeEach, AutoAcknowledgeBatch & IndividualAcknowledge, 
Dispatch method is missing a call to Rollback() when listener throws an 
exception.

Java version is doing this correctly but the .net version does not have that 
call.

http://permalink.gmane.org/gmane.comp.java.activemq.user/30901

Because of this, messages don't get properly nacked nor will they get into a 
DLQ correctly.


Java Code:

} catch (RuntimeException e) {
        LOG.error(getConsumerId() + " Exception while processing message: " +
md.getMessage().getMessageId(), e);
        if (isAutoAcknowledgeBatch() || isAutoAcknowledgeEach() ||
session.isIndividualAcknowledge()) {
            // schedual redelivery and possible dlq processing
            md.setRollbackCause(e);
            rollback();
        } else {
            // Transacted or Client ack: Deliver the
            // next message.
            afterMessageIsConsumed(md, false);
        }
    }


.Net version:

catch(Exception e)
{
        if(IsAutoAcknowledgeBatch || IsAutoAcknowledgeEach || 
IsIndividualAcknowledge)
        {
                // Redeliver the message
        }
        else
        {
                // Transacted or Client ack: Deliver the next message.
                this.AfterMessageIsConsumed(dispatch, false);
        }

        Tracer.Error(this.info.ConsumerId + " Exception while processing 
message: " + e);

        // If aborted we stop the abort here and let normal processing resume.
        // This allows the session to shutdown normally and ack all messages
        // that have outstanding acks in this consumer.
        if( (Thread.CurrentThread.ThreadState & ThreadState.AbortRequested) == 
ThreadState.AbortRequested)
        {
                Thread.ResetAbort();
        }
}


Think the solution is to call Rollback().


catch(Exception e)
{
        if(IsAutoAcknowledgeBatch || IsAutoAcknowledgeEach || 
IsIndividualAcknowledge)
        {
            // Redeliver the message
            Rollback(); // this takes care of checking the RedeliveryCounter 
and nacking when necessary
        }
        else
        {
                // Transacted or Client ack: Deliver the next message.
                this.AfterMessageIsConsumed(dispatch, false);
        }

        Tracer.Error(this.info.ConsumerId + " Exception while processing 
message: " + e);

        // If aborted we stop the abort here and let normal processing resume.
        // This allows the session to shutdown normally and ack all messages
        // that have outstanding acks in this consumer.
        if( (Thread.CurrentThread.ThreadState & ThreadState.AbortRequested) == 
ThreadState.AbortRequested)
        {
                Thread.ResetAbort();
        }
}


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

        

Reply via email to