You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2006/10/27 02:51:49 UTC

svn commit: r468214 - /geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java

Author: dain
Date: Thu Oct 26 17:51:48 2006
New Revision: 468214

URL: http://svn.apache.org/viewvc?view=rev&rev=468214
Log:
When tx is rollback only, don't try to commit and don't update the threadPooledTimer

Modified:
    geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java

Modified: geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java?view=diff&rev=468214&r1=468213&r2=468214
==============================================================================
--- geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java (original)
+++ geronimo/server/trunk/modules/geronimo-timer/src/main/java/org/apache/geronimo/timer/TransactionalExecutorTask.java Thu Oct 26 17:51:48 2006
@@ -18,6 +18,7 @@
 package org.apache.geronimo.timer;
 
 import javax.transaction.TransactionManager;
+import javax.transaction.Status;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -44,41 +45,81 @@
     }
 
     public void run() {
-        for (int tries = 0; tries < repeatCount; tries++) {
-            try {
-                transactionManager.begin();
-            } catch (Exception e) {
-                log.warn("Exception occured while starting container transaction", e);
-                break;
-            }
-            try {
+        try {
+            // try to do the work until it succeeded or we reach the repeat count
+            boolean succeeded = false;
+            for (int tries = 0; !succeeded && tries < repeatCount; tries++) {
                 try {
-                    userTask.run();
-                } catch (Exception e) {
-                    log.warn("Exception occured while running user task", e);
+                    if (!beginWork()) {
+                        break;
+                    }
+
+                    work();
+                } finally {
+                    succeeded = completeWork();
                 }
+            }
+
+            // if this was a one time thing, remove the job
+            if (workInfo.isOneTime()) {
+                threadPooledTimer.removeWorkInfo(workInfo);
+            }
+
+            // if we didn't succeed, log it
+            if (!succeeded) {
+                log.warn("Failed to execute work successfully");
+            }
+        } catch (RuntimeException e) {
+            log.warn("RuntimeException occured while running user task", e);
+            throw e;
+        } catch (Error e) {
+            log.warn("Error occured while running user task", e);
+            throw e;
+        }
+    }
+
+    private boolean beginWork() {
+        try {
+            transactionManager.begin();
+        } catch (Exception e) {
+            log.warn("Exception occured while starting container transaction", e);
+            return false;
+        }
+        return true;
+    }
+
+    private void work() {
+        try {
+            userTask.run();
+        } catch (Exception e) {
+            log.warn("Exception occured while running user task", e);
+        }
+    }
+
+    private boolean completeWork() {
+        try {
+            if (transactionManager.getStatus() == Status.STATUS_ACTIVE) {
+                // clean up the work persistent data
                 try {
                     threadPooledTimer.workPerformed(workInfo);
                 } catch (PersistenceException e) {
                     log.warn("Exception occured while updating timer persistent state", e);
                 }
-            } finally {
-                try {
-                    transactionManager.commit();
-                    if (workInfo.isOneTime()) {
-                        threadPooledTimer.removeWorkInfo(workInfo);
-                    }
-                    // todo this is a very weird code structure.... returning from a finally is very confusing
-                    return;
-                } catch (Exception e) {
-                    log.warn("Exception occured while completing container transaction", e);
-                }
+
+                // commit the tx
+                transactionManager.commit();
+
+                // all is cool
+                return true;
+            } else {
+                // tx was marked rollback, so roll it back
+                transactionManager.rollback();
             }
+        } catch (Exception e) {
+            log.warn("Exception occured while completing container transaction", e);
         }
-        if (workInfo.isOneTime()) {
-            threadPooledTimer.removeWorkInfo(workInfo);
-        }
-        log.warn("Failed to execute work successfully");
+        // something bad happened
+        return false;
     }
 
 }