Пример #1
0
  /**
   * Constructor
   *
   * @param transactionManagerLookup the transaction manager lookup implementation
   * @param softLockManager the soft lock manager
   * @param transactionIdFactory the transaction ID factory
   * @param cache the cache
   * @param store the underlying store
   * @param copyStrategy the original copy strategy
   */
  public XATransactionStore(
      TransactionManagerLookup transactionManagerLookup,
      SoftLockManager softLockManager,
      TransactionIDFactory transactionIdFactory,
      Ehcache cache,
      Store store,
      ReadWriteCopyStrategy<Element> copyStrategy) {
    super(store, copyStrategy);
    this.transactionManagerLookup = transactionManagerLookup;
    this.transactionIdFactory = transactionIdFactory;
    if (transactionManagerLookup.getTransactionManager() == null) {
      throw new TransactionException(
          "no JTA transaction manager could be located, cannot bind twopc cache with JTA");
    }
    this.softLockManager = softLockManager;
    this.cache = cache;

    // this xaresource is for initial registration and recovery
    this.recoveryResource =
        new EhcacheXAResourceImpl(
            cache,
            underlyingStore,
            transactionManagerLookup,
            softLockManager,
            transactionIdFactory,
            copyStrategy,
            commitObserver,
            rollbackObserver,
            recoveryObserver);
    transactionManagerLookup.register(recoveryResource, true);
  }
Пример #2
0
  private XATransactionContext getTransactionContext() {
    try {
      Transaction transaction = getCurrentTransaction();
      EhcacheXAResourceImpl xaResource =
          (EhcacheXAResourceImpl) transactionToXAResourceMap.get(transaction);
      if (xaResource == null) {
        return null;
      }
      XATransactionContext transactionContext = xaResource.getCurrentTransactionContext();

      if (transactionContext == null) {
        transactionManagerLookup.register(xaResource, false);
        LOG.debug("creating new XA context");
        transactionContext = xaResource.createTransactionContext();
        xaResource.addTwoPcExecutionListener(new UnregisterXAResource());
      } else {
        transactionContext = xaResource.getCurrentTransactionContext();
      }

      LOG.debug("using XA context {}", transactionContext);
      return transactionContext;
    } catch (SystemException e) {
      throw new TransactionException("cannot get the current transaction", e);
    } catch (RollbackException e) {
      throw new TransactionException("transaction rolled back", e);
    }
  }
Пример #3
0
 private Transaction getCurrentTransaction() throws SystemException {
   Transaction transaction = transactionManagerLookup.getTransactionManager().getTransaction();
   if (transaction == null) {
     throw new TransactionException("JTA transaction not started");
   }
   return transaction;
 }
Пример #4
0
  /** {@inheritDoc} */
  public int getTerracottaClusteredSize() {
    try {
      Transaction transaction = transactionManagerLookup.getTransactionManager().getTransaction();
      if (transaction == null) {
        return underlyingStore.getTerracottaClusteredSize();
      }
    } catch (SystemException se) {
      throw new TransactionException("cannot get the current transaction", se);
    }

    LOG.debug("cache {} getTerracottaClusteredSize", cache.getName());
    XATransactionContext context = getOrCreateTransactionContext();
    int size = underlyingStore.getTerracottaClusteredSize();
    return size + context.getSizeModifier();
  }
Пример #5
0
 @Override
 public void dispose() {
   super.dispose();
   transactionManagerLookup.unregister(recoveryResource, true);
 }