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

中间件编程

开发平台:

Java

  1. package org.jboss.blacktie.jatmibroker.core.transport;
  2. import javax.naming.Context;
  3. import javax.naming.InitialContext;
  4. import javax.naming.NamingException;
  5. import javax.transaction.InvalidTransactionException;
  6. import javax.transaction.NotSupportedException;
  7. import javax.transaction.SystemException;
  8. import javax.transaction.Transaction;
  9. import javax.transaction.TransactionManager;
  10. import org.apache.log4j.LogManager;
  11. import org.apache.log4j.Logger;
  12. import org.jboss.blacktie.jatmibroker.jab.JABTransaction;
  13. import org.omg.CosTransactions.Control;
  14. import org.omg.CosTransactions.Unavailable;
  15. import com.arjuna.ats.internal.jta.transaction.jts.AtomicTransaction;
  16. import com.arjuna.ats.internal.jta.transaction.jts.TransactionImple;
  17. import com.arjuna.ats.internal.jts.ControlWrapper;
  18. import com.arjuna.ats.internal.jts.ORBManager;
  19. /**
  20.  * Wrapper class for running JBossTS transactions in an application server
  21.  */
  22. public class JtsTransactionImple extends TransactionImple {
  23. private static final Logger log = LogManager
  24. .getLogger(JtsTransactionImple.class);
  25. private static TransactionManager tm;
  26. private static final String IORTag = "IOR";
  27. /**
  28.  * Construct a transaction based on an OTS control
  29.  * 
  30.  * @param wrapper
  31.  *            the wrapped OTS control
  32.  */
  33. public JtsTransactionImple(ControlWrapper wrapper) {
  34. super(new AtomicTransaction(wrapper));
  35. }
  36. /**
  37.  * associate a new transaction with the calling thread
  38.  * 
  39.  * @return true if a new transaction is associated
  40.  */
  41. public static boolean begin() {
  42. if (getTransactionManager() != null) {
  43. try {
  44. tm.begin();
  45. return true;
  46. } catch (NotSupportedException e) {
  47. log.debug("Unable to start a new transaction: " + e);
  48. } catch (SystemException e) {
  49. log.debug("Unable to start a new transaction: " + e);
  50. }
  51. }
  52. return false;
  53. }
  54. /**
  55.  * check whether the calling thread is associated with a transaction
  56.  * 
  57.  * @return true if there is transaction on the callers thread
  58.  */
  59. public static boolean hasTransaction() {
  60. try {
  61. return (getTransactionManager() != null && tm.getTransaction() != null);
  62. } catch (SystemException e) {
  63. return false;
  64. }
  65. }
  66. /**
  67.  * Re-associate a transaction with the callers thread
  68.  * 
  69.  * @param tx
  70.  *            the transaction to associated
  71.  */
  72. public static void resume(Transaction tx) {
  73. try {
  74. if (tx != null && getTransactionManager() != null) {
  75. log.debug("resuming " + tx);
  76. tm.resume(tx);
  77. } else {
  78. log.debug("nothing to rusume: tm=" + tm);
  79. }
  80. } catch (SystemException e) {
  81. log.info("resume error: " + e);
  82. } catch (InvalidTransactionException e) { // invalid transaction.
  83. log.info("resume error: " + e);
  84. } catch (IllegalStateException e) { // the thread is already associated
  85. // with another transaction.
  86. log.info("resume error: " + e);
  87. }
  88. }
  89. /**
  90.  * Associated a transaction with the callers thread
  91.  * 
  92.  * @param ior
  93.  *            IOR for the corresponding OTS transaction
  94.  */
  95. public static void resume(String ior) {
  96. log.debug("resume control");
  97. Transaction tx = controlToTx(ior);
  98. resume(tx);
  99. }
  100. /**
  101.  * Dissassociate the transaction currently associated with the callers
  102.  * thread
  103.  * 
  104.  * @return the dissassociated transaction
  105.  */
  106. public static Transaction suspend() {
  107. log.debug("suspend");
  108. try {
  109. if (getTransactionManager() != null) {
  110. log.debug("suspending current");
  111. return tm.suspend();
  112. }
  113. } catch (SystemException e) {
  114. log.debug("suspend error: " + e);
  115. }
  116. return null;
  117. }
  118. /**
  119.  * Convert an IOR representing an OTS transaction into a JTA transaction
  120.  * 
  121.  * @param ior
  122.  *            the CORBA reference for the OTS transaction
  123.  * @return a JTA transaction that wraps the OTS transaction
  124.  */
  125. private static Transaction controlToTx(String ior) {
  126. log.debug("controlToTx: ior: " + ior);
  127. if (ior == null)
  128. return null;
  129. ControlWrapper cw = createControlWrapper(ior);
  130. TransactionImple tx = (TransactionImple) TransactionImple
  131. .getTransactions().get(cw.get_uid());
  132. if (tx == null) {
  133. log.debug("controlToTx: creating a new tx - wrapper: " + cw);
  134. tx = new JtsTransactionImple(cw);
  135. putTransaction(tx);
  136. }
  137. return tx;
  138. }
  139. /**
  140.  * Lookup the JTA transaction manager
  141.  * 
  142.  * @return the JTA transaction manager in the VM
  143.  */
  144. public static TransactionManager getTransactionManager() {
  145. if (tm == null) {
  146. try {
  147. Context ctx = new InitialContext();
  148. tm = (TransactionManager) ctx
  149. .lookup("java:/TransactionManager");
  150. } catch (NamingException e) {
  151. return null;
  152. }
  153. }
  154. return tm;
  155. }
  156. /**
  157.  * If the current transaction represents an OTS transaction then return it
  158.  * IOR
  159.  * 
  160.  * @return the IOR or null if the current transaction is not an OTS
  161.  *         transaction
  162.  */
  163. public static String getTransactionIOR() {
  164. log.debug("getTransactionIOR");
  165. JABTransaction curr = JABTransaction.current();
  166. if (curr != null) {
  167. log.debug("have JABTransaction");
  168. return curr.getControlIOR();
  169. } else if (getTransactionManager() != null) {
  170. try {
  171. log.debug("have tx mgr");
  172. Transaction tx = tm.getTransaction();
  173. if (tx instanceof TransactionImple) {
  174. log.debug("have arjuna tx");
  175. TransactionImple atx = (TransactionImple) tx;
  176. ControlWrapper cw = atx.getControlWrapper();
  177. if (cw == null) {
  178. log
  179. .warn("getTransactionIOR transaction has no control wrapper");
  180. } else if (haveORB()) {
  181. try {
  182. log.debug("lookup control");
  183. Control c = cw.get_control();
  184. String ior = ORBManager.getORB().orb()
  185. .object_to_string(c);
  186. log.debug("getTransactionIOR: ior: " + ior);
  187. return ior;
  188. } catch (Unavailable e) {
  189. log
  190. .warn("getTransactionIOR transaction has no control: "
  191. + e.getMessage());
  192. }
  193. }
  194. }
  195. } catch (SystemException e) {
  196. log.debug("excpeption: " + e.getMessage());
  197. e.printStackTrace();
  198. }
  199. }
  200. return null;
  201. }
  202. private static ControlWrapper createControlWrapper(String ior) {
  203. if (haveORB() && ior.startsWith(IORTag)) {
  204. org.omg.CORBA.Object obj = ORBManager.getORB().orb()
  205. .string_to_object(ior);
  206. Control control = org.omg.CosTransactions.ControlHelper.narrow(obj);
  207. if (control == null)
  208. log.debug("createProxy: ior not a control");
  209. return new ControlWrapper(control);
  210. } else {
  211. return null;
  212. }
  213. }
  214. public static boolean haveORB() {
  215. return (ORBManager.isInitialised());
  216. }
  217. public static org.omg.CORBA.ORB getDefaultORB() {
  218. if (haveORB())
  219. try {
  220. return ORBManager.getORB().orb();
  221. } catch (Throwable t) {
  222. }
  223. return null;
  224. }
  225. }