[
https://issues.apache.org/jira/browse/AMQNET-335?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13063359#comment-13063359
]
Timothy Bish commented on AMQNET-335:
-------------------------------------
Its possible that there wouldn't be any side effects in the current version.
The best way to tell how things are affected is to create a new set of unit
tests that demonstrate the various scenarios where things currently don't work
for you so that we can add them to the tests we already have so that the code
can be validated.
> 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://activemq.2283324.n4.nabble.com/Apache-NMS-ActiveMQ-MessageConsumer-bug-td3566206.html
> Because of this, messages don't get properly nacked nor will they get into a
> DLQ correctly.
> Java Code:
> {code:java}
> } 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);
> }
> }
> {code}
> .Net version:
> {code}
> 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();
> }
> }
> {code}
> Think the solution is to call Rollback().
> {code}
> 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();
> }
> }
> {code}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira