activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rasitha Wijesinghe (JIRA)" <jira+amq...@apache.org>
Subject [jira] [Created] (AMQNET-335) MessageConsumer does not Rollback on Exception
Date Thu, 07 Jul 2011 23:16:18 GMT
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

        

Mime
View raw message