ThreadActionData.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:6k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2006, Red Hat Middleware LLC, and individual contributors 
  4.  * as indicated by the @author tags. 
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors. 
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A 
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
  16.  * MA  02110-1301, USA.
  17.  * 
  18.  * (C) 2005-2006,
  19.  * @author JBoss Inc.
  20.  */
  21. /*
  22.  * Copyright (C) 1998, 1999, 2000, 2001,
  23.  *
  24.  * Arjuna Solutions Limited,
  25.  * Newcastle upon Tyne,
  26.  * Tyne and Wear,
  27.  * UK.
  28.  *
  29.  * $Id: ThreadActionData.java 2342 2006-03-30 13:06:17Z  $
  30.  */
  31. package org.jboss.blacktie.jatmibroker.core.util;
  32. import java.util.EmptyStackException;
  33. import java.util.NoSuchElementException;
  34. import java.util.Stack;
  35. import org.jboss.blacktie.jatmibroker.jab.JABTransaction;
  36. /**
  37.  * This class maintains a mapping between a thread and its notion of the current
  38.  * transaction. Essentially this is a stack of transactions.
  39.  * 
  40.  * @author Mark Little (mark@arjuna.com)
  41.  * @version $Id: ThreadActionData.java 2342 2006-03-30 13:06:17Z $
  42.  * @since JTS 1.0.
  43.  */
  44. public class ThreadActionData {
  45. public static JABTransaction currentAction() {
  46. // XXX NOT USED ThreadActionData.setup();
  47. Stack txs = (Stack) _threadList.get();
  48. if (txs != null) {
  49. try {
  50. return (JABTransaction) txs.peek();
  51. } catch (EmptyStackException e) {
  52. }
  53. }
  54. return null;
  55. }
  56. public static void pushAction(JABTransaction a) {
  57. pushAction(a, true);
  58. }
  59. /**
  60.  * By setting the register flag accordingly, information about the thread
  61.  * may not be propagated to the action, i.e., only the thread's notion of
  62.  * current changes.
  63.  */
  64. public static void pushAction(JABTransaction a, boolean register) {
  65. Thread t = Thread.currentThread();
  66. Stack txs = (Stack) _threadList.get();
  67. if (txs == null) {
  68. txs = new Stack();
  69. txs.push(a);
  70. _threadList.set(txs);
  71. } else
  72. txs.push(a);
  73. if (register)
  74. a.addChildThread(t);
  75. }
  76. /**
  77.  * Put back the entire hierarchy, removing whatever is already there.
  78.  */
  79. public static void restoreActions(JABTransaction act) {
  80. purgeActions();
  81. if (act != null) {
  82. /*
  83.  * First get the hierarchy from the bottom up.
  84.  */
  85. java.util.Stack s = new java.util.Stack();
  86. JABTransaction nextLevel = act.parent();
  87. s.push(act);
  88. while (nextLevel != null) {
  89. s.push(nextLevel);
  90. nextLevel = nextLevel.parent();
  91. }
  92. /*
  93.  * Now push the hierarchy onto the thread stack.
  94.  */
  95. try {
  96. while (!s.empty()) {
  97. pushAction((JABTransaction) s.pop());
  98. }
  99. } catch (Exception ex) {
  100. }
  101. }
  102. }
  103. public static JABTransaction popAction() throws EmptyStackException {
  104. return popAction(ThreadUtil.getThreadId(), true);
  105. }
  106. public static JABTransaction popAction(boolean unregister)
  107. throws EmptyStackException {
  108. return popAction(ThreadUtil.getThreadId(), unregister);
  109. }
  110. public static JABTransaction popAction(String threadId)
  111. throws EmptyStackException {
  112. return popAction(threadId, true);
  113. }
  114. /**
  115.  * By setting the unregister flag accordingly, information about the thread
  116.  * is not removed from the action.
  117.  */
  118. public static JABTransaction popAction(String threadId, boolean unregister)
  119. throws EmptyStackException {
  120. Stack txs = (Stack) _threadList.get();
  121. if (txs != null) {
  122. JABTransaction a = (JABTransaction) txs.pop();
  123. if ((a != null) && (unregister)) {
  124. a.removeChildThread(threadId);
  125. }
  126. if (txs.size() == 0) {
  127. _threadList.set(null);
  128. }
  129. return a;
  130. }
  131. return null;
  132. }
  133. public static void purgeAction(JABTransaction act)
  134. throws NoSuchElementException {
  135. ThreadActionData.purgeAction(act, Thread.currentThread(), true);
  136. }
  137. public static void purgeAction(JABTransaction act, Thread t)
  138. throws NoSuchElementException {
  139. ThreadActionData.purgeAction(act, t, true);
  140. }
  141. public static void purgeAction(JABTransaction act, Thread t,
  142. boolean unregister) throws NoSuchElementException {
  143. if ((act != null) && (unregister)) {
  144. act.removeChildThread(ThreadUtil.getThreadId(t));
  145. }
  146. Stack txs = (Stack) _threadList.get();
  147. if (txs != null) {
  148. txs.removeElement(act);
  149. if (txs.size() == 0) {
  150. _threadList.set(null);
  151. }
  152. }
  153. }
  154. public static void purgeActions() {
  155. purgeActions(Thread.currentThread(), true);
  156. }
  157. public static void purgeActions(Thread t) {
  158. purgeActions(t, true);
  159. }
  160. public static void purgeActions(Thread t, boolean unregister) {
  161. Stack txs = (Stack) _threadList.get();
  162. _threadList.set(null);
  163. if (txs != null) {
  164. if (unregister) {
  165. while (!txs.empty()) {
  166. JABTransaction act = (JABTransaction) txs.pop();
  167. if (act != null) {
  168. act.removeChildThread(ThreadUtil.getThreadId(t));
  169. }
  170. }
  171. }
  172. }
  173. }
  174. /**
  175.  * Add a per thread setup object to the global list. This should only happen
  176.  * before the transaction service really begins, or you risk having some
  177.  * threads see one view of the list that is different to other threads.
  178.  * 
  179.  * @param s
  180.  *            the setup to add.
  181.  */
  182. /*
  183.  * XXX NOT USED public static void addSetup (ThreadSetup s) { synchronized
  184.  * (_threadSetups) { _threadSetups.add(s); } }
  185.  */
  186. /**
  187.  * Remove a per thread setup object to the global list. This should only
  188.  * happen after the transaction service really ends, or you risk having some
  189.  * threads see one view of the list that is different to other threads.
  190.  * 
  191.  * @param s
  192.  *            the setup to add.
  193.  */
  194. /*
  195.  * XXX NOT USED public static boolean removeSetup (ThreadSetup s) {
  196.  * synchronized (_threadSetups) { return _threadSetups.remove(s); } }
  197.  * 
  198.  * private static void setup () { for (int i = 0; i < _threadSetups.size();
  199.  * i++) { ThreadSetup s = (ThreadSetup) _threadSetups.get(i);
  200.  * 
  201.  * if (s != null) s.setup(); } }
  202.  * 
  203.  * private static ArrayList _threadSetups = new ArrayList();
  204.  */
  205. private static ThreadLocal _threadList = new ThreadLocal();
  206. }