xamanager.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 314 行

JAVA
314
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.ejb3.xa;import com.caucho.jca.*;import com.caucho.transaction.*;import com.caucho.util.*;import java.util.logging.*;import javax.ejb.*;import javax.transaction.*;import javax.transaction.xa.*;/** * Manages XA for bean methods. */public class XAManager{  private static L10N L = new L10N(XAManager.class);  private static Logger log    = Logger.getLogger(XAManager.class.getName());  private UserTransactionProxy _ut;  public XAManager()  {    _ut = UserTransactionProxy.getInstance();  }  /**   * Enlists a resource   */  public void enlist(XAResource xaResource)  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.getTransaction();      if (xa != null && xaResource != null)	xa.enlistResource(xaResource);    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Enlists a resource   */  public void registerSynchronization(SessionSynchronization sync)  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.getTransaction();      if (xa != null && sync != null) {	sync.afterBegin();		xa.registerSynchronization(new SynchronizationAdapter(sync));      }    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Begins a manadatory transaction.   */  public void beginMandatory()  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.getTransaction();      if (xa == null)	throw new EJBTransactionRequiredException(L.l("Transaction required for for 'Mandatory' TransactionAttribute"));    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Begins a never transaction.   */  public void beginNever()  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.getTransaction();      if (xa != null)	throw new EJBException(L.l("Transaction forbidden for 'Never' TransactionAttribute"));    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Begins a required transaction.   *   * @return the current transaction if it exists   */  public Transaction beginRequired()  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.getTransaction();          if (xa != null)	return xa;      _ut.begin();      return null;    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Begins a requires-new transaction.   *   * @return the current transaction if it exists   */  public Transaction beginRequiresNew()  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          Transaction xa = tm.suspend();      _ut.begin();      return xa;    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Begins a requires-new transaction.   *   * @return the current transaction if it exists   */  public void endRequiresNew(Transaction xa)  {    try {      _ut.commit();    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    } finally {      try {	if (xa != null) {	  TransactionManagerImpl tm = TransactionManagerImpl.getLocal();    	  tm.resume(xa);	}      } catch (RuntimeException e) {	throw e;      } catch (Exception e) {	throw new EJBException(e);      }    }  }  /**   * Begins a not-supported transaction, i.e. suspend any current transaction.   *   * @return the current transaction if it exists   */  public Transaction beginNotSupported()  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();          return tm.suspend();    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Mark the transaction for rollback   */  public void markRollback(Exception e)  {    _ut.setRollbackOnly(e);  }  /**   * Commits transaction.   */  public void commit()  {    try {      _ut.commit();    } catch (RuntimeException e) {      throw e;    } catch (RollbackException e) {      throw new TransactionRolledbackLocalException(e.getMessage(), e);    } catch (HeuristicMixedException e) {      throw new TransactionRolledbackLocalException(e.getMessage(), e);    } catch (HeuristicRollbackException e) {      throw new TransactionRolledbackLocalException(e.getMessage(), e);    } catch (Exception e) {      throw new EJBException(e);    }  }  /**   * Resumes transaction.   */  public void resume(Transaction xa)  {    try {      TransactionManagerImpl tm = TransactionManagerImpl.getLocal();            tm.resume(xa);    } catch (RuntimeException e) {      throw e;    } catch (Exception e) {      throw new EJBException(e);    }  }  public static class SynchronizationAdapter implements Synchronization {    private final SessionSynchronization _sync;    SynchronizationAdapter(SessionSynchronization sync)    {      _sync = sync;    }    public void beforeCompletion()    {      try {	_sync.beforeCompletion();      } catch (RuntimeException e) {	throw e;      } catch (Exception e) {	throw new EJBException(e);      }    }    public void afterCompletion(int status)    {      try {	_sync.afterCompletion(status == Status.STATUS_COMMITTED);      } catch (RuntimeException e) {	throw e;      } catch (Exception e) {	throw new EJBException(e);      }    }    			       public String toString()    {      return getClass().getSimpleName() + "[" + _sync + "]";    }  }  public String toString()  {    return "XAManager[]";  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?