[jboss-svn-commits] JBL Code SVN: r5400 - in labs/jbosstm/trunk: ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore ArjunaJTA/jta/classes/com/arjuna/ats/jta/common ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspe! cific/hporb/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts atsintegration/classes/com/arjuna/ats/jbossatx/jta atsintegration/classes/com/arjuna/ats/jbossatx/jts
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Aug 2 04:42:36 EDT 2006
Author: kevin.conner at jboss.com
Date: 2006-08-02 04:42:06 -0400 (Wed, 02 Aug 2006)
New Revision: 5400
Modified:
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java
labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl
labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java
labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java
labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java
labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java
labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java
labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java
Log:
4.2.1 update to JTA/JTS/core/integration
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -129,7 +129,7 @@
public int begin (int timeout)
{
int status = super.start();
-
+
if (status == ActionStatus.RUNNING)
{
/*
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -849,7 +849,8 @@
if (_childThreads == null)
_childThreads = new Hashtable();
- _childThreads.put(t.getName(), t); // makes sure so we don't get
+ final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+ _childThreads.put(threadId, t); // makes sure so we don't get
// duplicates
result = true;
@@ -880,7 +881,8 @@
public final boolean removeChildThread () // current thread
{
- return removeChildThread(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ return removeChildThread(threadId);
}
/**
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -113,8 +113,16 @@
_list = null;
}
- public final long checkingPeriod ()
+ public final synchronized long checkingPeriod ()
{
+ if (_dynamic)
+ {
+ final ReaperElement head = (ReaperElement)_list.peak() ;
+ if (head != null)
+ {
+ return head._absoluteTimeout - System.currentTimeMillis() ;
+ }
+ }
return _checkPeriod;
}
@@ -129,12 +137,11 @@
* Timeout is given in milliseconds.
*/
- public final boolean check (long timeout)
+ public final boolean check()
{
if (tsLogger.arjLogger.debugAllowed())
{
- tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "TransactionReaper::check ( "
- + timeout + " )");
+ tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "TransactionReaper::check ()");
}
if (_list.size() == 0)
@@ -151,97 +158,86 @@
{ Long.toString(e._absoluteTimeout) });
}
- if (timeout >= e._absoluteTimeout)
- break;
- else
- {
- iter = null;
- return true;
- }
- }
+ final long now = System.currentTimeMillis() ;
+ if (now >= e._absoluteTimeout)
+ {
+ if (e._control.running())
+ {
+ /*
+ * If this is a local transaction, then we can roll it back
+ * completely. Otherwise, just mark it as rollback only.
+ */
- iter = null;
+ boolean problem = false;
- if (e != null)
- {
- /*
- * Only force rollback if the transaction is still running.
- */
+ try
+ {
+ if (e._control.cancel() == ActionStatus.ABORTED)
+ {
+ if (tsLogger.arjLoggerI18N.debugAllowed())
+ {
+ tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
+ { e._control.get_uid() });
+ }
+ }
+ else
+ problem = true;
+ }
+ catch (Exception ex2)
+ {
+ if (tsLogger.arjLoggerI18N.isWarnEnabled())
+ {
+ tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_4", new Object[]
+ { e._control });
+ }
- if (e._control.running())
- {
- /*
- * If this is a local transaction, then we can roll it back
- * completely. Otherwise, just mark it as rollback only.
- */
+ problem = true;
+ }
- boolean problem = false;
+ if (problem)
+ {
+ boolean error = false;
+ boolean printDebug = tsLogger.arjLoggerI18N.isWarnEnabled();
- try
- {
- if (e._control.cancel() == ActionStatus.ABORTED)
- {
- if (tsLogger.arjLoggerI18N.debugAllowed())
- {
- tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
- { e._control.get_uid() });
- }
- }
- else
- problem = true;
- }
- catch (Exception ex2)
- {
- if (tsLogger.arjLoggerI18N.isWarnEnabled())
- {
- tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_4", new Object[]
- { e._control });
- }
+ try
+ {
+ error = !e._control.preventCommit();
+ }
+ catch (Exception ex3)
+ {
+ error = true;
+ }
- problem = true;
- }
+ if (error || printDebug)
+ {
+ if (error)
+ {
+ if (tsLogger.arjLoggerI18N.isWarnEnabled())
+ {
+ tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_5", new Object[]
+ { e._control });
+ }
+ }
+ else
+ {
+ if (tsLogger.arjLoggerI18N.debugAllowed())
+ {
+ tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
+ { e._control });
+ }
+ }
+ }
+ }
+ }
- if (problem)
- {
- boolean error = false;
- boolean printDebug = tsLogger.arjLoggerI18N.isWarnEnabled();
-
- try
- {
- error = !e._control.preventCommit();
- }
- catch (Exception ex3)
- {
- error = true;
- }
-
- if (error || printDebug)
- {
- if (error)
- {
- if (tsLogger.arjLoggerI18N.isWarnEnabled())
- {
- tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_5", new Object[]
- { e._control });
- }
- }
- else
- {
- if (tsLogger.arjLoggerI18N.debugAllowed())
- {
- tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
- { e._control });
- }
- }
- }
- }
+ _list.remove(e);
+ }
+ else
+ {
+ break;
}
-
- _list.remove(e);
}
- System.gc(); // do some garbage collection while we're at it!
-
return true;
}
@@ -275,24 +271,25 @@
if (timeout == 0)
return true;
- TransactionReaper._lifetime += timeout;
-
- /*
- * If the timeout for this transaction is less than the current timeout
- * for the reaper thread (or one is not set for the reaper thread) then
- * use that timeout and interrupt the thread to get it to recheck.
- */
-
- if ((timeout < _checkPeriod) || (_checkPeriod == Long.MAX_VALUE))
- {
- _checkPeriod = timeout * 1000; // convert to milliseconds!
- TransactionReaper._reaperThread.interrupt();
- }
-
ReaperElement e = new ReaperElement(control, timeout);
synchronized (this)
{
+ TransactionReaper._lifetime += timeout;
+
+ /*
+ * If the timeout for this transaction is less than the current timeout
+ * for the reaper thread (or one is not set for the reaper thread) then
+ * use that timeout and interrupt the thread to get it to recheck.
+ */
+
+ final long timeoutms = timeout*1000 ;
+ if ((timeoutms < _checkPeriod) || (_checkPeriod == Long.MAX_VALUE))
+ {
+ _checkPeriod = timeoutms ; // convert to milliseconds!
+ notify();
+ }
+
if (_list.insert(e))
return true;
else
@@ -491,7 +488,7 @@
* Don't bother synchronizing as this is only an estimate anyway.
*/
- public static final long transactionLifetime ()
+ public static final synchronized long transactionLifetime ()
{
return TransactionReaper._lifetime;
}
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -56,7 +56,8 @@
{
if (action != null)
{
- action.removeChildThread(this.getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(this)) ;
+ action.removeChildThread(threadId);
action = null;
}
}
@@ -68,14 +69,15 @@
* should work!
*/
- if (actions.get(thread.getName()) == null)
+ final String threadId = Integer.toHexString(System.identityHashCode(thread)) ;
+ if (actions.get(threadId) == null)
{
BasicAction currentAction = BasicAction.Current();
if (currentAction != null)
{
currentAction.addChildThread(thread);
- actions.put(thread.getName(), currentAction);
+ actions.put(threadId, currentAction);
currentAction = null;
}
@@ -86,13 +88,14 @@
public static void destroy (Thread thread) throws IllegalArgumentException
{
- BasicAction currentAction = (BasicAction) actions.remove(thread.getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(thread)) ;
+ BasicAction currentAction = (BasicAction) actions.remove(threadId);
if (currentAction != null)
{
if (currentAction != null)
{
- currentAction.removeChildThread(thread.getName());
+ currentAction.removeChildThread(threadId);
currentAction = null;
}
}
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -34,8 +34,6 @@
import com.arjuna.ats.arjuna.logging.tsLogger;
import com.arjuna.ats.arjuna.logging.FacilityCode;
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.ActionStatus;
import com.arjuna.ats.arjuna.coordinator.TransactionReaper;
import com.arjuna.common.util.logging.*;
@@ -66,80 +64,48 @@
public void run ()
{
- if (tsLogger.arjLogger.debugAllowed())
- {
- tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
- FacilityCode.FAC_ATOMIC_ACTION, "ReaperThread.run ()");
- }
-
- for (;;)
- {
- /*
- * Cannot assume we sleep for the entire period. We may
- * be interrupted. If we are, just run a check anyway and
- * ignore.
- */
-
- boolean done = false;
-
- while (!done)
- {
- sleepPeriod = reaperObject.checkingPeriod();
-
- long oldPeriod = sleepPeriod;
- long beforeTime = System.currentTimeMillis();
-
- try
- {
- if (tsLogger.arjLoggerI18N.debugAllowed())
- {
- tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
- FacilityCode.FAC_ATOMIC_ACTION,
- "com.arjuna.ats.internal.arjuna.coordinator.ReaperThread_1",
- new Object[]{Thread.currentThread(),
- Long.toString(sleepPeriod)});
- }
-
- Thread.sleep(sleepPeriod);
-
- done = true;
- }
- catch (InterruptedException e1)
- {
- /*
- * Has timeout been changed?
- */
-
- if (reaperObject.checkingPeriod() != oldPeriod)
- {
- done = true;
- }
- else
- {
- long afterTime = System.currentTimeMillis();
-
- if (afterTime - beforeTime < reaperObject.checkingPeriod())
- {
- done = true;
- }
- }
- }
- catch (Exception e2)
- {
- done = true;
- }
- }
-
- if (_shutdown)
- return;
-
- reaperObject.check(System.currentTimeMillis());
-
- if (reaperObject.numberOfTransactions() == 0)
- {
- sleepPeriod = Long.MAX_VALUE;
- }
- }
+ if (tsLogger.arjLogger.debugAllowed())
+ {
+ tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
+ FacilityCode.FAC_ATOMIC_ACTION, "ReaperThread.run ()");
+ }
+
+ for (;;)
+ {
+ /*
+ * Cannot assume we sleep for the entire period. We may
+ * be interrupted. If we are, just run a check anyway and
+ * ignore.
+ */
+
+ synchronized(reaperObject)
+ {
+ sleepPeriod = reaperObject.checkingPeriod();
+
+ if (sleepPeriod > 0)
+ {
+ try
+ {
+ if (tsLogger.arjLoggerI18N.isDebugEnabled())
+ {
+ tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
+ FacilityCode.FAC_ATOMIC_ACTION,
+ "com.arjuna.ats.internal.arjuna.coordinator.ReaperThread_1",
+ new Object[]{Thread.currentThread(),
+ Long.toString(sleepPeriod)});
+ }
+
+ reaperObject.wait(sleepPeriod);
+ }
+ catch (InterruptedException e1) {}
+ }
+ }
+
+ if (_shutdown)
+ return;
+
+ reaperObject.check();
+ }
}
public void shutdown ()
@@ -153,4 +119,3 @@
}
-
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -41,10 +41,7 @@
*/
package com.arjuna.ats.internal.arjuna.objectstore.jdbc;
-import java.io.IOException;
-
import java.sql.Blob;
-import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -67,6 +64,8 @@
public class oracle_driver extends JDBCImple
{
+ private static final int MAX_RETRIES = 10 ;
+
public InputObjectState read_state (Uid objUid, String tName, int ft, String tableName) throws ObjectStoreException
{
InputObjectState newImage = null;
@@ -81,47 +80,62 @@
int pool = getPool();
ResultSet rs = null;
- try
- {
- PreparedStatement pstmt = _preparedStatements[pool][READ_STATE];
+ try
+ {
+ for(int count = 0 ; count < MAX_RETRIES ; count++)
+ {
+ try
+ {
+ PreparedStatement pstmt = _preparedStatements[pool][READ_STATE];
+
+ if (pstmt == null)
+ {
+ pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
+
+ _preparedStatements[pool][READ_STATE] = pstmt;
+ }
+
+ pstmt.setString(1, objUid.stringForm());
+ pstmt.setString(2, tName);
+ pstmt.setInt(3, ft);
+
+ rs = pstmt.executeQuery();
+
+ if(! rs.next()) {
+ return null; // no matching state in db
+ }
+
+ Blob myBlob = (Blob)rs.getBlob(1);
+ byte[] buffer = myBlob.getBytes(1, (int)myBlob.length());
+
+ if (buffer != null)
+ {
+ newImage = new InputObjectState(objUid, tName, buffer);
+ }
+ else {
+ if (tsLogger.arjLoggerI18N.isWarnEnabled())
+ tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_1");
+ }
- if (pstmt == null)
- {
- pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
-
- _preparedStatements[pool][READ_STATE] = pstmt;
- }
-
- pstmt.setString(1, objUid.stringForm());
- pstmt.setString(2, tName);
- pstmt.setInt(3, ft);
-
- rs = pstmt.executeQuery();
-
- if(! rs.next()) {
- return null; // no matching state in db
- }
-
- Blob myBlob = (Blob)rs.getBlob(1);
- byte[] buffer = myBlob.getBytes(1, (int)myBlob.length());
-
- if (buffer != null)
- {
- newImage = new InputObjectState(objUid, tName, buffer);
- }
- else {
- if (tsLogger.arjLoggerI18N.isWarnEnabled())
- tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_1");
- }
- }
- catch (Throwable e)
- {
- if(retryConnection(e, pool)) {
- return read_state(objUid, tName, ft, tableName);
- } else {
- throw new ObjectStoreException(e.toString());
- }
- }
+ return newImage;
+ }
+ catch (Throwable e)
+ {
+ if (count == MAX_RETRIES-1)
+ {
+ throw new ObjectStoreException(e.toString());
+ }
+ try
+ {
+ reconnect(pool) ;
+ }
+ catch (final Throwable th)
+ {
+ throw new ObjectStoreException(e.toString());
+ }
+ }
+ }
+ }
finally
{
try
@@ -134,18 +148,15 @@
freePool(pool);
}
}
+ return newImage;
}
else
throw new ObjectStoreException("oracle.read_state - object with uid "+objUid+" has no TypeName");
-
- return newImage;
}
public boolean write_state (Uid objUid, String tName, OutputObjectState state, int s, String tableName) throws ObjectStoreException
{
- boolean result = false;
-
int imageSize = (int) state.length();
if (imageSize > _maxStateSize)
@@ -159,75 +170,90 @@
ResultSet rs = null;
ResultSet rs3 = null;
- try
- {
- PreparedStatement pstmt = _preparedStatements[pool][READ_WRITE_SHORTCUT];
-
- _theConnection[pool].setAutoCommit(false);
-
- if (pstmt == null)
- {
- pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND StateType = ? AND TypeName = ? FOR UPDATE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
- _preparedStatements[pool][READ_WRITE_SHORTCUT] = pstmt;
- }
- pstmt.setString(1, objUid.stringForm());
- pstmt.setInt(2, s);
- pstmt.setString(3, tName);
-
- rs = pstmt.executeQuery();
-
- if( rs.next() ) {
-
- BLOB myBlob = (BLOB)rs.getBlob(1);
- myBlob.putBytes(1, b);
-
- } else {
- // not in database, do insert:
- PreparedStatement pstmt2 = _preparedStatements[pool][WRITE_STATE_NEW];
-
- if (pstmt2 == null)
- {
- pstmt2 = _theConnection[pool].prepareStatement("INSERT INTO "+tableName+" (StateType,TypeName,UidString,ObjectState) VALUES (?,?,?,empty_blob())");
-
- _preparedStatements[pool][WRITE_STATE_NEW] = pstmt2;
- }
-
- pstmt2.setInt(1, s);
- pstmt2.setString(2, tName);
- pstmt2.setString(3, objUid.stringForm());
-
- pstmt2.executeUpdate();
- _theConnection[pool].commit();
-
- PreparedStatement pstmt3 = _preparedStatements[pool][SELECT_FOR_WRITE_STATE];
- if(pstmt3 == null) {
- pstmt3 = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ? FOR UPDATE");
- _preparedStatements[pool][SELECT_FOR_WRITE_STATE] = pstmt3;
- }
-
- pstmt3.setString(1, objUid.stringForm());
- pstmt3.setString(2, tName);
- pstmt3.setInt(3, s);
-
- rs3 = pstmt3.executeQuery();
- rs3.next();
- BLOB myBlob = (BLOB)rs3.getBlob(1);
- myBlob.putBytes(1, b);
- }
-
- _theConnection[pool].commit();
- result = true;
-
- }
- catch(Throwable e)
- {
- if(retryConnection(e, pool)) {
- return write_state(objUid, tName, state, s, tableName);
- } else {
- if (tsLogger.arjLoggerI18N.isWarnEnabled())
- tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_2", new Object[] {e});
- }
- }
+ try
+ {
+ for(int count = 0 ; count < MAX_RETRIES ; count++)
+ {
+ try
+ {
+ PreparedStatement pstmt = _preparedStatements[pool][READ_WRITE_SHORTCUT];
+
+ _theConnection[pool].setAutoCommit(false);
+
+ if (pstmt == null)
+ {
+ pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND StateType = ? AND TypeName = ? FOR UPDATE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
+ _preparedStatements[pool][READ_WRITE_SHORTCUT] = pstmt;
+ }
+ pstmt.setString(1, objUid.stringForm());
+ pstmt.setInt(2, s);
+ pstmt.setString(3, tName);
+
+ rs = pstmt.executeQuery();
+
+ if( rs.next() ) {
+
+ BLOB myBlob = (BLOB)rs.getBlob(1);
+ myBlob.putBytes(1, b);
+
+ } else {
+ // not in database, do insert:
+ PreparedStatement pstmt2 = _preparedStatements[pool][WRITE_STATE_NEW];
+
+ if (pstmt2 == null)
+ {
+ pstmt2 = _theConnection[pool].prepareStatement("INSERT INTO "+tableName+" (StateType,TypeName,UidString,ObjectState) VALUES (?,?,?,empty_blob())");
+
+ _preparedStatements[pool][WRITE_STATE_NEW] = pstmt2;
+ }
+
+ pstmt2.setInt(1, s);
+ pstmt2.setString(2, tName);
+ pstmt2.setString(3, objUid.stringForm());
+
+ pstmt2.executeUpdate();
+ _theConnection[pool].commit();
+
+ PreparedStatement pstmt3 = _preparedStatements[pool][SELECT_FOR_WRITE_STATE];
+ if(pstmt3 == null) {
+ pstmt3 = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ? FOR UPDATE");
+ _preparedStatements[pool][SELECT_FOR_WRITE_STATE] = pstmt3;
+ }
+
+ pstmt3.setString(1, objUid.stringForm());
+ pstmt3.setString(2, tName);
+ pstmt3.setInt(3, s);
+
+ rs3 = pstmt3.executeQuery();
+ rs3.next();
+ BLOB myBlob = (BLOB)rs3.getBlob(1);
+ myBlob.putBytes(1, b);
+ }
+
+ _theConnection[pool].commit();
+ return true ;
+
+ }
+ catch(Throwable e)
+ {
+ if (count == MAX_RETRIES-1)
+ {
+ if (tsLogger.arjLoggerI18N.isWarnEnabled()) {
+ tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_2", new Object[] {e});
+ }
+ return false ;
+ }
+ try
+ {
+ reconnect(pool) ;
+ }
+ catch (final Throwable th)
+ {
+ throw new ObjectStoreException(e.toString());
+ }
+ }
+ }
+ }
finally
{
try
@@ -254,7 +280,7 @@
freePool(pool);
}
}
- return result;
+ return false ;
}
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -217,20 +217,16 @@
{
if (ptr.car() == element) // we mean '==' rather than equals
{
- OrderedListEntry oldcons = ptr;
-
// unlink the cons cell for the element we're removing
if (prev != null)
prev.setfCdr(ptr.cdr());
else
_headOfList = ptr.cdr();
+ ptr.setfCdr(null) ;
_entryCount--;
- // flush the dead cons cell
- oldcons = null;
-
return true;
}
}
@@ -250,6 +246,7 @@
OrderedListElement p = _headOfList.car();
_headOfList = remove.cdr();
+ remove.setfCdr(null) ;
_entryCount--;
remove = null;
@@ -259,6 +256,20 @@
else
return null;
}
+
+ public final synchronized OrderedListElement peak()
+ {
+ if (_headOfList != null)
+ {
+ return _headOfList.car();
+ }
+ return null;
+ }
+
+ final synchronized OrderedListEntry head()
+ {
+ return _headOfList;
+ }
/**
* Empty the list.
@@ -283,8 +294,8 @@
return _entryCount;
}
-protected OrderedListEntry _headOfList;
-protected long _entryCount;
+private OrderedListEntry _headOfList;
+private long _entryCount;
private boolean _increasing;
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -51,17 +51,17 @@
return _theElement;
}
-public final OrderedListEntry cdr ()
+public synchronized final OrderedListEntry cdr ()
{
return _next;
}
-public final void setfCdr (OrderedListEntry n)
+public synchronized final void setfCdr (OrderedListEntry n)
{
_next = n;
}
-private OrderedListElement _theElement;
+private final OrderedListElement _theElement;
private OrderedListEntry _next;
};
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -48,7 +48,7 @@
public OrderedListIterator (OrderedList L)
{
- ptr = L._headOfList;
+ ptr = L.head();
}
public void finalize ()
@@ -60,7 +60,7 @@
* Return the next item in the list.
*/
-public synchronized OrderedListElement iterate ()
+public OrderedListElement iterate ()
{
if (ptr != null)
{
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -145,13 +145,15 @@
public static BasicAction popAction () throws EmptyStackException
{
- return popAction(Thread.currentThread().getName(), true);
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ return popAction(threadId, true);
}
public static BasicAction popAction (boolean unregister)
throws EmptyStackException
{
- return popAction(Thread.currentThread().getName(), unregister);
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ return popAction(threadId, unregister);
}
public static BasicAction popAction (String threadId)
@@ -206,7 +208,10 @@
throws NoSuchElementException
{
if ((act != null) && (unregister))
- act.removeChildThread(t.getName());
+ {
+ final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+ act.removeChildThread(threadId);
+ }
Stack txs = (Stack) _threadList.get();
@@ -246,7 +251,10 @@
BasicAction act = (BasicAction) txs.pop();
if (act != null)
- act.removeChildThread(t.getName());
+ {
+ final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+ act.removeChildThread(threadId);
+ }
}
}
}
Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -168,7 +168,7 @@
System.arraycopy(xid.data, nodeNameIndex, buff, 0, buff.length);
- Uid tx = new Uid(new String(buff), false);
+ Uid tx = new Uid(new String(buff), true);
buff = null;
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -83,8 +83,8 @@
}
}
- Integer value = (Integer) _timeouts.get(Thread.currentThread()
- .getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ Integer value = (Integer) _timeouts.get(threadId);
int v = 0; // if not set then assume 0. What else can we do?
if (value != null)
@@ -213,13 +213,14 @@
public void setTransactionTimeout(int seconds)
throws javax.transaction.SystemException
{
- _timeouts.put(Thread.currentThread().getName(), new Integer(seconds));
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ _timeouts.put(threadId, new Integer(seconds));
}
public int getTimeout() throws javax.transaction.SystemException
{
- Integer value = (Integer) _timeouts.get(Thread.currentThread()
- .getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ Integer value = (Integer) _timeouts.get(threadId);
if (value != null)
{
@@ -262,7 +263,8 @@
throw new javax.transaction.SystemException(e2.toString());
}
- Integer value = (Integer) _timeouts.get(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ Integer value = (Integer) _timeouts.get(threadId);
int v = 0; // if not set then assume 0. What else can we do?
if (value != null)
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -37,6 +37,9 @@
import com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple;
import com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord;
+import com.arjuna.ats.jta.common.Configuration;
+import com.arjuna.ats.jta.common.Environment;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
import com.arjuna.ats.jta.utils.XAHelper;
import com.arjuna.ats.jta.xa.XidImple;
import com.arjuna.ats.jta.logging.*;
@@ -98,6 +101,7 @@
_resources = new Hashtable();
_duplicateResources = new Hashtable();
_suspendCount = 0;
+ _xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
}
/**
@@ -629,29 +633,32 @@
{
try
{
+ if (_xaTransactionTimeoutEnabled)
+ {
+ int timeout = _theTransaction.getTimeout();
+
+ if (timeout > 0)
+ {
+ try
+ {
+ xaRes.setTransactionTimeout(timeout);
+ }
+ catch (XAException te)
+ {
+ if (jtaLogger.loggerI18N.isWarnEnabled())
+ {
+ jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
+ { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
+ }
+ }
+ }
+ }
+
int xaStartNormal = ((theModifier == null) ? XAResource.TMNOFLAGS
: theModifier.xaStartParameters(XAResource.TMNOFLAGS));
xaRes.start(xid, xaStartNormal);
- int timeout = _theTransaction.getTimeout();
-
- if (timeout > 0)
- {
- try
- {
- xaRes.setTransactionTimeout(timeout);
- }
- catch (XAException te)
- {
- if (jtaLogger.loggerI18N.isWarnEnabled())
- {
- jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
- { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
- }
- }
- }
-
associatedWork = true;
_resources.put(xaRes, new TxInfo(xid));
@@ -690,8 +697,8 @@
{
if (jtaLogger.loggerI18N.isWarnEnabled())
{
- jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.enliststartfailed", new Object[]
- { "TransactionImple.enlistResource", xid });
+ jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.enliststarterror", new Object[]
+ { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(e), xid });
}
markRollbackOnly();
@@ -1116,6 +1123,7 @@
}
_suspendCount = 0;
+ _xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
}
final com.arjuna.ats.arjuna.AtomicAction getAtomicAction()
@@ -1541,12 +1549,38 @@
_transactions.remove(tx.get_uid());
}
+ private static boolean getXATransactionTimeoutEnabled()
+ {
+ final Boolean xaTransactionTimeoutEnabled = Configuration.getXATransactionTimeoutEnabled() ;
+ if (xaTransactionTimeoutEnabled != null)
+ {
+ return xaTransactionTimeoutEnabled.booleanValue() ;
+ }
+ return XA_TRANSACTION_TIMEOUT_ENABLED ;
+ }
+
protected com.arjuna.ats.arjuna.AtomicAction _theTransaction;
private Hashtable _resources;
private Hashtable _duplicateResources;
private int _suspendCount;
+ private final boolean _xaTransactionTimeoutEnabled ;
+ private static final boolean XA_TRANSACTION_TIMEOUT_ENABLED ;
+
+ static
+ {
+ final String xaTransactionTimeoutEnabled = jtaPropertyManager.propertyManager.getProperty(Environment.XA_TRANSACTION_TIMEOUT_ENABLED) ;
+ if (xaTransactionTimeoutEnabled != null)
+ {
+ XA_TRANSACTION_TIMEOUT_ENABLED = Boolean.valueOf(xaTransactionTimeoutEnabled).booleanValue() ;
+ }
+ else
+ {
+ XA_TRANSACTION_TIMEOUT_ENABLED = true ;
+ }
+ }
+
private static Hashtable _transactions = new Hashtable();
}
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl 2006-08-02 08:42:06 UTC (rev 5400)
@@ -66,8 +66,19 @@
_propFile = file;
}
+ public static synchronized final Boolean getXATransactionTimeoutEnabled()
+ {
+ return _xaTransactionTimeoutEnabled ;
+ }
+
+ public static synchronized final void setXATransactionTimeoutEnabled(final Boolean xaTransactionTimeoutEnabled)
+ {
+ _xaTransactionTimeoutEnabled = xaTransactionTimeoutEnabled ;
+ }
+
private static String _lockStore = null;
private static String _propFile = "@PROPERTIES_FILE@";
+private static Boolean _xaTransactionTimeoutEnabled ;
}
Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -54,6 +54,7 @@
public static final String TM_JNDI_CONTEXT = "com.arjuna.ats.jta.utils.TMJNDIContext";
public static final String XA_ERROR_HANDLER = "com.arjuna.ats.jta.xaErrorHandler";
+ public static final String XA_TRANSACTION_TIMEOUT_ENABLED = "com.arjuna.ats.jta.xaTransactionTimeoutEnabled";
}
Modified: labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -46,7 +46,10 @@
import com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator;
import com.arjuna.ats.jta.xa.*;
+import com.arjuna.ats.jta.common.Configuration;
+import com.arjuna.ats.jta.common.Environment;
import com.arjuna.ats.jta.logging.*;
+import com.arjuna.ats.jts.common.jtsPropertyManager;
import com.arjuna.ats.internal.jta.xa.TxInfo;
@@ -685,25 +688,28 @@
{
try
{
- xaRes.start(xid, XAResource.TMNOFLAGS);
+ if (_xaTransactionTimeoutEnabled)
+ {
+ int timeout = _theTransaction.getTimeout();
- int timeout = _theTransaction.getTimeout();
+ if (timeout > 0)
+ {
+ try
+ {
+ xaRes.setTransactionTimeout(timeout);
+ }
+ catch (XAException te)
+ {
+ if (jtaLogger.loggerI18N.isWarnEnabled())
+ {
+ jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
+ { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
+ }
+ }
+ }
+ }
- if (timeout > 0)
- {
- try
- {
- xaRes.setTransactionTimeout(timeout);
- }
- catch (XAException te)
- {
- if (jtaLogger.loggerI18N.isWarnEnabled())
- {
- jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
- { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
- }
- }
- }
+ xaRes.start(xid, XAResource.TMNOFLAGS);
associatedWork = true;
@@ -1218,6 +1224,7 @@
jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.jts.syncproblem", ex);
}
+ _xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
}
protected void commitAndDisassociate ()
@@ -1641,11 +1648,37 @@
}
}
+ private static boolean getXATransactionTimeoutEnabled()
+ {
+ final Boolean xaTransactionTimeoutEnabled = Configuration.getXATransactionTimeoutEnabled() ;
+ if (xaTransactionTimeoutEnabled != null)
+ {
+ return xaTransactionTimeoutEnabled.booleanValue() ;
+ }
+ return XA_TRANSACTION_TIMEOUT_ENABLED ;
+ }
+
protected AtomicTransaction _theTransaction;
private Hashtable _resources;
private Hashtable _duplicateResources;
private int _suspendCount;
+ private final boolean _xaTransactionTimeoutEnabled ;
+
+ private static final boolean XA_TRANSACTION_TIMEOUT_ENABLED ;
+
+ static
+ {
+ final String xaTransactionTimeoutEnabled = jtsPropertyManager.propertyManager.getProperty(Environment.XA_TRANSACTION_TIMEOUT_ENABLED) ;
+ if (xaTransactionTimeoutEnabled != null)
+ {
+ XA_TRANSACTION_TIMEOUT_ENABLED = Boolean.valueOf(xaTransactionTimeoutEnabled).booleanValue() ;
+ }
+ else
+ {
+ XA_TRANSACTION_TIMEOUT_ENABLED = true ;
+ }
+ }
private static Hashtable _transactions = new Hashtable();
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -60,7 +60,6 @@
import java.io.PrintStream;
import java.util.*;
import java.lang.Object;
-import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.*;
import org.omg.PortableInterceptor.*;
@@ -180,7 +179,8 @@
com.arjuna.ats.jts.logging.FacilityCode.FAC_OTS, "ContextManager::current ()");
}
- Object arg = otsCurrent.get(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ Object arg = otsCurrent.get(threadId);
ControlWrapper wrapper = null;
if (arg != null)
@@ -317,7 +317,8 @@
public final ControlWrapper popAction ()
{
- return popAction(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ return popAction(threadId);
}
public final void purgeActions (String threadId)
@@ -348,7 +349,8 @@
public final void purgeActions ()
{
- purgeActions(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ purgeActions(threadId);
}
/**
@@ -592,8 +594,8 @@
com.arjuna.ats.jts.logging.FacilityCode.FAC_OTS, "ContextManager::pushAction ()");
}
- Thread ct = Thread.currentThread();
- Stack sl = (Stack) otsCurrent.get(ct.getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ Stack sl = (Stack) otsCurrent.get(threadId);
boolean isNew = false;
if (sl == null)
@@ -621,7 +623,7 @@
sl.push(action);
if (isNew)
- otsCurrent.put(ct.getName(), sl);
+ otsCurrent.put(threadId, sl);
associateContext();
@@ -684,7 +686,8 @@
org.omg.CORBA.Any threadData = ORBManager.getORB().orb().create_any();
- threadData.insert_string(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ threadData.insert_string(threadId);
_piCurrent.set_slot(slotId, threadData);
@@ -835,7 +838,8 @@
{
org.omg.CORBA.Any localDataAny = ORBManager.getORB().orb().create_any();
- localDataAny.insert_string(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ localDataAny.insert_string(threadId);
_piCurrent.set_slot(slotId, localDataAny);
}
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -42,23 +42,28 @@
public static final synchronized void remove () throws SystemException
{
- otsCheckedAction.remove(Thread.currentThread().getName());
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ otsCheckedAction.remove(threadId);
}
public static final synchronized CheckedAction get () throws SystemException
{
- if (otsCheckedAction != null)
- return (CheckedAction) otsCheckedAction.get(Thread.currentThread().getName());
- else
- return null;
+ if (otsCheckedAction != null)
+ {
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ return (CheckedAction) otsCheckedAction.get(threadId);
+ }
+ else
+ return null;
}
public static final synchronized void set (CheckedAction ca) throws SystemException
{
- if (otsCheckedAction == null)
- otsCheckedAction = new Hashtable();
-
- otsCheckedAction.put(Thread.currentThread().getName(), ca);
+ if (otsCheckedAction == null)
+ otsCheckedAction = new Hashtable();
+
+ final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ otsCheckedAction.put(threadId, ca);
}
private static Hashtable otsCheckedAction = null;
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -181,7 +181,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.hporb.interceptors.context.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -176,7 +176,7 @@
throw new UNKNOWN("Invalid PI tx parameter!");
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -183,7 +183,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.jacorb.interceptors.context.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -181,7 +181,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.jacorb.interceptors.interposition.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -198,7 +198,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.javaidl.interceptors.context.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -196,7 +196,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.javaidl.interceptors.interposition.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -178,7 +178,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.orbix2000.interceptors.context.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -178,7 +178,7 @@
throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.orbix2000.interceptors.interposition.invalidparam"));
}
else
- threadId = Thread.currentThread().getName();
+ threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
if (threadId != null)
{
Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -66,8 +66,6 @@
log.debug("PropagationContextManager.getTransactionPropagationContext - called");
}
- String threadId = Thread.currentThread().getName();
-
String txid = ((BasicAction.Current() == null) ? null : BasicAction.Current().get_uid().stringForm());
return txid;
Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -18,4 +18,5 @@
* (C) 2005-2006,
* @author JBoss Inc.
*/
-/*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
*
* Arjuna Technologies Ltd.
* Newcastle upon Tyne,
* Tyne and Wear,
* UK.
*
* $Id: PropagationContextManager.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
*/
package com.arjuna.ats.internal.jbossatx.jts;
import org.jboss.tm.TransactionPropagationContextFactory;
import org.jboss.tm.TransactionPropagationContextImporter;
import org.jboss.logging.Logger;
import org.omg.CosTransactions.*;
import javax.transaction.Transaction;
import javax.naming.spi.ObjectFactory;
import javax.naming.Name;
import javax.naming.Context;
import java.util.Hashtable;
import java.io.Serializable;
import com.arjuna.ats.internal.jts.ControlWrapper;
import com.arjuna.ats.internal.jts.OTSImpleManager;
import com.arjuna.ats.jta.TransactionManager;
import com.arjuna.ats.jts.ExplicitInterposition;
public class PropagationContextManager
implements TransactionPropagationContextFactory, TransactionPropagationContextImporter, ObjectFactory, Serializable
{
private Logger log = org.jboss.logging.Logger.getLogger(PropagationContextManager.class);
/**
* Return a transaction propagation context for the transaction
* currently associated with the invoking thread, or <code>null</code>
* if the invoking thread is not associated with a transaction.
*/
public Object getTransactionPropagationContext()
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.getTransactionPropagationContext - called");
}
String threadId = Thread.currentThread().getName();
ControlWrapper theControl;
if (threadId != null)
{
theControl = OTSImpleManager.current().contextManager().current(threadId);
}
else
{
theControl = OTSImpleManager.current().contextManager().current();
}
try
{
PropagationContext cxt = theControl.get_coordinator().get_txcontext();
return new PropagationContextWrapper(cxt);
}
catch (Exception e)
{
}
return null;
}
/**
* Return a transaction propagation context for the transaction
* given as an argument, or <code>null</code>
* if the argument is <code>null</code> or of a type unknown to
* this factory.
*/
public Object getTransactionPropagationContext(Transaction tx)
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.getTransactionPropagationContext(Transaction) - called tx = " + tx);
}
Transaction oldTx = null;
Object tpc = null;
javax.transaction.TransactionManager tm = TransactionManager.transactionManager();
try
{
oldTx = tm.getTransaction();
if ((tx == null) || (tx.equals(oldTx)))
{
// we are being called in the context of this transaction
tpc = getTransactionPropagationContext();
}
else
{
tm.suspend();
tm.resume(tx);
tpc = getTransactionPropagationContext();
tm.suspend();
tm.resume(oldTx);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
return tpc;
}
}
/**
* Import the transaction propagation context into the transaction
* manager, and return the resulting transaction.
* If this transaction propagation context has already been imported
* into the transaction manager, this method simply returns the
* <code>Transaction</code> representing the transaction propagation
* context in the local VM.
* Returns <code>null</code> if the transaction propagation context is
* <code>null</code>, or if it represents a <code>null</code> transaction.
*/
public Transaction importTransactionPropagationContext(Object tpc)
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - called tpc = " + tpc);
}
javax.transaction.TransactionManager tm = TransactionManager.transactionManager();
if (tpc instanceof PropagationContextWrapper)
{
try
{
PropagationContext omgTpc = ((PropagationContextWrapper) tpc).getPropagationContext();
ExplicitInterposition ei = new ExplicitInterposition(omgTpc, true);
Transaction newTx = tm.getTransaction();
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - transaction = " + newTx);
}
ei.unregisterTransaction();
return newTx;
}
catch (Exception e)
{
log.error("Unexpected exception occurred", e);
return null;
}
}
else
{
log.error("jboss-atx: unknown Tx PropagationContext");
return null;
}
}
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment) throws Exception
{
return new PropagationContextManager();
}
}
+/*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
*
* Arjuna Technologies Ltd.
* Newcastle upon Tyne,
* Tyne and Wear,
* UK.
*
* $Id: PropagationContextManager.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
*/
package com.arjuna.ats.internal.jbossatx.jts;
import org.jboss.tm.TransactionPropagationContextFactory;
import org.jboss.tm.TransactionPropagationContextImporter;
import org.jboss.logging.Logger;
import org.omg.CosTransactions.*;
import javax.transaction.Transaction;
import javax.naming.spi.ObjectFactory;
import javax.naming.Name;
import javax.naming.Context;
import java.util.Hashtable;
import java.io.Serializable;
import com.arjuna.ats.internal.jts.ControlWrapper;
import com.arjuna.ats.internal.jts.OTSImpleManager;
import com.arjuna.ats.jta.TransactionManager;
import com.arjuna.ats.jts.ExplicitInterposition;
public class PropagationContextManager
implements TransactionPropagationContextFactory, TransactionPropagationContextImporter, ObjectFactory, Serializable
{
private Logger log = org.jboss.logging.Logger.getLogger(PropagationContextManager.class);
/**
* Return a transaction propagation context for the transaction
* currently associated with the invoking thread, or <code>null</code>
* if the invoking thread is not associated with a transaction.
*/
public Object getTransactionPropagationContext()
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.getTransactionPropagationContext - called");
}
final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+ ControlWrapper theControl;
if (threadId != null)
{
theControl = OTSImpleManager.current().contextManager().current(threadId);
}
else
{
theControl = OTSImpleManager.current().contextManager().current();
}
try
{
PropagationContext cxt = theControl.get_coordinator().get_txcontext();
return new PropagationContextWrapper(cxt);
}
catch (Exception e)
{
}
return null;
}
/**
* Return a transaction propagation context for the transaction
* given as an argument, or <code>null</code>
* if the argument is <code>null</code> or of a type unknown to
* this factory.
*/
public Object getTransactionPropagationContext(Transaction tx)
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.getTransactionPropagationContext(Transaction) - called tx = " + tx);
}
Transaction oldTx = null;
Object tpc = null;
javax.transaction.TransactionManager tm = TransactionManager.transactionManager();
try
{
oldTx = tm.getTransaction();
if ((tx == null) || (tx.equals(oldTx)))
{
// we are being called in the context of this transaction
tpc = getTransactionPropagationContext();
}
else
{
tm.suspend();
tm.resume(tx);
tpc = getTransactionPropagationContext();
tm.suspend();
tm.resume(oldTx);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return tpc;
}
/**
* Import the transaction propagation context into the transaction
* manager, and return the resulting transaction.
* If this transaction propagation context has already been imported
* into the transaction manager, this method simply returns the
* <code>Transaction</code> representing the transaction propagation
* context in the local VM.
* Returns <code>null</code> if the transaction propagation context is
* <code>null</code>, or if it represents a <code>null</code> transaction.
*/
public Transaction importTransactionPropagationContext(Object tpc)
{
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - called tpc = " + tpc);
}
javax.transaction.TransactionManager tm = TransactionManager.transactionManager();
if (tpc instanceof PropagationContextWrapper)
{
try
{
PropagationContext omgTpc = ((PropagationContextWrapper) tpc).getPropagationContext();
ExplicitInterposition ei = new ExplicitInterposition(omgTpc, true);
Transaction newTx = tm.getTransaction();
if (log.isDebugEnabled())
{
log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - transaction = " + newTx);
}
ei.unregisterTransaction();
return newTx;
}
catch (Exception e)
{
log.error("Unexpected exception occurred", e);
return null;
}
}
else
{
log.error("jboss-atx: unknown Tx PropagationContext");
return null;
}
}
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment) throws Exception
{
return new PropagationContextManager();
}
}
Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -30,7 +30,9 @@
*/
package com.arjuna.ats.jbossatx.jta;
+import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.system.ServiceMBeanSupport;
+import org.jboss.system.server.Server;
import org.jboss.tm.JBossXATerminator;
import org.jboss.tm.XAExceptionFormatter;
@@ -40,7 +42,7 @@
import com.arjuna.ats.jta.utils.JNDIManager;
import com.arjuna.ats.jta.common.Environment;
import com.arjuna.ats.jta.common.jtaPropertyManager;
-import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
import com.arjuna.ats.arjuna.coordinator.TxStats;
import com.arjuna.ats.arjuna.recovery.RecoveryManager;
@@ -48,6 +50,11 @@
import com.arjuna.common.util.propertyservice.PropertyManagerFactory;
import com.arjuna.common.util.propertyservice.PropertyManager;
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationFilterSupport;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
import javax.naming.Reference;
import javax.naming.InitialContext;
import javax.transaction.TransactionManager;
@@ -64,7 +71,7 @@
* @author Richard A. Begg (richard.begg at arjuna.com)
* @version $Id: TransactionManagerService.java,v 1.5 2005/06/24 15:24:15 kconner Exp $
*/
-public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean
+public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean, NotificationListener
{
public final static String PROPAGATE_FULL_CONTEXT_PROPERTY = "com.arjuna.ats.jbossatx.jta.propagatefullcontext";
@@ -74,9 +81,7 @@
private static final JBossXATerminator TERMINATOR = new XATerminator() ;
private RecoveryManager _recoveryManager;
- private boolean _initialised = false;
private boolean _runRM = true;
- private int _transactionTimeout = -1;
/**
* Use the short class name as the default for the service name.
@@ -125,11 +130,7 @@
{
if (_runRM)
{
- this.getLog().info("Starting recovery manager");
-
- _recoveryManager = RecoveryManager.manager() ;
-
- this.getLog().info("Recovery manager started");
+ registerNotification() ;
}
else
{
@@ -158,19 +159,20 @@
jtaPropertyManager.propertyManager.setProperty(Environment.JTA_UT_IMPLEMENTATION, UserTransactionImple.class.getName());
JNDIManager.bindJTATransactionManagerImplementation();
+ }
+
+ /**
+ * Handle JMX notification.
+ * @param notification The JMX notification event.
+ * @param param The notification parameter.
+ */
+ public void handleNotification(final Notification notification, final Object param)
+ {
+ this.getLog().info("Starting recovery manager");
- /** Signal that the transaction manager has been bound **/
- _initialised = true;
+ _recoveryManager = RecoveryManager.manager() ;
- /**
- * If a call to set transaction has been called before the transaction
- * manager is bound then set the transaction timeout now
- */
- if (_transactionTimeout != -1)
- {
- this.getLog().info("Transaction timeout set to " + _transactionTimeout);
- setTransactionTimeout(_transactionTimeout);
- }
+ this.getLog().info("Recovery manager started");
}
private boolean isRecoveryManagerRunning() throws Exception
@@ -268,19 +270,12 @@
*/
public void setTransactionTimeout(int timeout) throws javax.transaction.SystemException
{
- if (_initialised)
+ if (timeout > 0)
{
- javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
-
- tm.setTransactionTimeout(timeout);
+ TxControl.setDefaultTimeout(timeout);
}
else
- {
- if (timeout > 0)
- _transactionTimeout = timeout;
- else
- throw new javax.transaction.SystemException("Transaction Timeout < 0");
- }
+ throw new javax.transaction.SystemException("Transaction Timeout < 0");
}
/**
@@ -409,6 +404,17 @@
_runRM = runRM;
}
+ private void registerNotification()
+ throws InstanceNotFoundException
+ {
+ final NotificationFilterSupport notificationFilter = new NotificationFilterSupport() ;
+ notificationFilter.enableType(Server.START_NOTIFICATION_TYPE) ;
+
+ final ObjectName serverName = ObjectNameFactory.create("jboss.system:type=Server") ;
+
+ getServer().addNotificationListener(serverName, this, notificationFilter, null) ;
+ }
+
private void bindRef(String jndiName, String className)
throws Exception
{
Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java 2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java 2006-08-02 08:42:06 UTC (rev 5400)
@@ -31,7 +31,9 @@
package com.arjuna.ats.jbossatx.jts;
import org.jboss.system.ServiceMBeanSupport;
+import org.jboss.system.server.Server;
import org.jboss.iiop.CorbaORBService;
+import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.tm.JBossXATerminator;
import org.jboss.tm.XAExceptionFormatter;
import com.arjuna.ats.internal.jbossatx.jts.PropagationContextWrapper;
@@ -42,7 +44,6 @@
import com.arjuna.ats.jta.common.Environment;
import com.arjuna.ats.jta.common.jtaPropertyManager;
import com.arjuna.ats.jts.common.jtsPropertyManager;
-import com.arjuna.ats.arjuna.common.Uid;
import com.arjuna.ats.arjuna.coordinator.TxStats;
import com.arjuna.ats.arjuna.recovery.RecoveryManager;
import com.arjuna.orbportability.ORB;
@@ -53,6 +54,11 @@
import com.arjuna.common.util.propertyservice.PropertyManagerFactory;
import com.arjuna.common.util.propertyservice.PropertyManager;
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationFilterSupport;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
import javax.naming.Reference;
import javax.naming.InitialContext;
import javax.transaction.TransactionManager;
@@ -69,7 +75,7 @@
* @author Richard A. Begg (richard.begg at arjuna.com)
* @version $Id: TransactionManagerService.java,v 1.17 2005/06/24 15:24:14 kconner Exp $
*/
-public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean
+public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean, NotificationListener
{
public final static String PROPAGATE_FULL_CONTEXT_PROPERTY = "com.arjuna.ats.jbossatx.jts.propagatefullcontext";
@@ -79,7 +85,6 @@
private static final JBossXATerminator TERMINATOR = new XATerminator() ;
private RecoveryManager _recoveryManager;
- private boolean _initialised = false;
private boolean _runRM = true;
/**
@@ -146,11 +151,7 @@
{
if (_runRM)
{
- this.getLog().info("Starting recovery manager");
-
- _recoveryManager = RecoveryManager.manager() ;
-
- this.getLog().info("Recovery manager started");
+ registerNotification() ;
}
else
{
@@ -179,9 +180,20 @@
jtaPropertyManager.propertyManager.setProperty(Environment.JTA_UT_IMPLEMENTATION, UserTransactionImple.class.getName());
JNDIManager.bindJTATransactionManagerImplementation();
+ }
+
+ /**
+ * Handle JMX notification.
+ * @param notification The JMX notification event.
+ * @param param The notification parameter.
+ */
+ public void handleNotification(final Notification notification, final Object param)
+ {
+ this.getLog().info("Starting recovery manager");
- /** Signal that the transaction manager has been bound **/
- _initialised = true;
+ _recoveryManager = RecoveryManager.manager() ;
+
+ this.getLog().info("Recovery manager started");
}
private boolean isRecoveryManagerRunning() throws Exception
@@ -414,6 +426,17 @@
{
_runRM = runRM;
}
+
+ private void registerNotification()
+ throws InstanceNotFoundException
+ {
+ final NotificationFilterSupport notificationFilter = new NotificationFilterSupport() ;
+ notificationFilter.enableType(Server.START_NOTIFICATION_TYPE) ;
+
+ final ObjectName serverName = ObjectNameFactory.create("jboss.system:type=Server") ;
+
+ getServer().addNotificationListener(serverName, this, notificationFilter, null) ;
+ }
private void bindRef(String jndiName, String className)
throws Exception
More information about the jboss-svn-commits
mailing list