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

Rasitha Wijesinghe updated AMQNET-335:
--------------------------------------

    Priority: Minor  (was: Major)

> 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
>            Priority: Minor
>
> 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