[jboss-cvs] JBossAS SVN: r57246 - branches/JBoss_4_0_3_SP1_CP/messaging/src/main/org/jboss/mq/server

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Sep 27 18:45:54 EDT 2006


Author: ryan.campbell at jboss.com
Date: 2006-09-27 18:45:53 -0400 (Wed, 27 Sep 2006)
New Revision: 57246

Modified:
   branches/JBoss_4_0_3_SP1_CP/messaging/src/main/org/jboss/mq/server/BasicQueue.java
Log:
ASPATCH-66: JBAS-3622: Patch for: JBAS-3573: Failure to remove a message should result in a NACK + error

Modified: branches/JBoss_4_0_3_SP1_CP/messaging/src/main/org/jboss/mq/server/BasicQueue.java
===================================================================
--- branches/JBoss_4_0_3_SP1_CP/messaging/src/main/org/jboss/mq/server/BasicQueue.java	2006-09-27 22:14:25 UTC (rev 57245)
+++ branches/JBoss_4_0_3_SP1_CP/messaging/src/main/org/jboss/mq/server/BasicQueue.java	2006-09-27 22:45:53 UTC (rev 57246)
@@ -26,6 +26,7 @@
 import org.jboss.mq.SpyMessage;
 import org.jboss.mq.Subscription;
 import org.jboss.mq.pm.Tx;
+import org.jboss.mq.pm.TxManager;
 import org.jboss.mq.selectors.Selector;
 import org.jboss.util.timeout.Timeout;
 import org.jboss.util.timeout.TimeoutFactory;
@@ -560,14 +561,23 @@
       }
       else
       {
-         if (m.isPersistent())
-            server.getPersistenceManager().remove(m, txId);
+         try
+         {
+            if (m.isPersistent())
+               server.getPersistenceManager().remove(m, txId);
+         }
+         catch (Throwable t)
+         {
+            // Something is wrong with the persistence manager,
+            // force a NACK with a rollback/error
+            Runnable task = new RestoreMessageTask(m);
+            TxManager txManager = server.getPersistenceManager().getTxManager();
+            txManager.addPostCommitTask(txId, task);            
+            txManager.addPostRollbackTask(txId, task);
+            SpyJMSException.rethrowAsJMSException("Error during ACK ref=" + m, t);
+         }
 
-         Runnable task = new RestoreMessageTask(m);
-         server.getPersistenceManager().getTxManager().addPostRollbackTask(txId, task);
-
-         task = new RemoveMessageTask(m);
-         server.getPersistenceManager().getTxManager().addPostCommitTask(txId, task);
+         performOrPerpareAcknowledgeMessage(m, txId);
       }
 
       synchronized (receivers)
@@ -580,6 +590,27 @@
    }
 
    /**
+    * Either perform or prepare the acknowledge message 
+    * 
+    * @param mes the message reference
+    * @param txId the transaction id
+    * @throws Exception for any error
+    */
+   protected void performOrPerpareAcknowledgeMessage(MessageReference mes, Tx txId) throws JMSException
+   {
+      TxManager txManager = server.getPersistenceManager().getTxManager();
+      
+      // The message is restored to the queue on a rollback
+      Runnable task = new RestoreMessageTask(mes);
+      txManager.addPostRollbackTask(txId, task);
+
+      // The message is fully removed after the transaction commits
+      task = new RemoveMessageTask(mes);
+      txManager.addPostCommitTask(txId, task);
+   }
+   
+   
+   /**
     * Nack all messages for a subscription
     *
     * @param sub the subscription




More information about the jboss-cvs-commits mailing list