org.infinispan.transaction.synchronization.SynchronizationAdapter Maven / Gradle / Ivy
package org.infinispan.transaction.synchronization;
import org.infinispan.commands.CommandsFactory;
import org.infinispan.commons.CacheException;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.interceptors.locking.ClusteringDependentLogic;
import org.infinispan.partitionhandling.impl.PartitionHandlingManager;
import org.infinispan.remoting.rpc.RpcManager;
import org.infinispan.transaction.impl.AbstractEnlistmentAdapter;
import org.infinispan.transaction.impl.LocalTransaction;
import org.infinispan.transaction.impl.TransactionCoordinator;
import org.infinispan.transaction.impl.TransactionTable;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import javax.transaction.Status;
import javax.transaction.Synchronization;
import javax.transaction.xa.XAException;
/**
* {@link Synchronization} implementation for integrating with the TM.
* See ISPN-888 for more information on this.
*
* @author [email protected]
* @since 5.0
*/
public class SynchronizationAdapter extends AbstractEnlistmentAdapter implements Synchronization {
private static final Log log = LogFactory.getLog(SynchronizationAdapter.class);
private static final boolean trace = log.isTraceEnabled();
private final LocalTransaction localTransaction;
public SynchronizationAdapter(LocalTransaction localTransaction, TransactionCoordinator txCoordinator,
CommandsFactory commandsFactory, RpcManager rpcManager,
TransactionTable transactionTable, ClusteringDependentLogic clusteringLogic,
Configuration configuration, PartitionHandlingManager partitionHandlingManager) {
super(localTransaction, commandsFactory, rpcManager, transactionTable, clusteringLogic, configuration, txCoordinator, partitionHandlingManager);
this.localTransaction = localTransaction;
}
@Override
public void beforeCompletion() {
log.tracef("beforeCompletion called for %s", localTransaction);
try {
txCoordinator.prepare(localTransaction);
} catch (XAException e) {
throw new CacheException("Could not prepare. ", e);//todo shall we just swallow this exception?
}
}
@Override
public void afterCompletion(int status) {
if (trace) {
log.tracef("afterCompletion(%s) called for %s.", status, localTransaction);
}
boolean isOnePhase;
if (status == Status.STATUS_COMMITTED) {
try {
isOnePhase = txCoordinator.commit(localTransaction, false);
} catch (XAException e) {
throw new CacheException("Could not commit.", e);
}
releaseLocksForCompletedTransaction(localTransaction, isOnePhase);
} else if (status == Status.STATUS_ROLLEDBACK) {
try {
txCoordinator.rollback(localTransaction);
} catch (XAException e) {
throw new CacheException("Could not commit.", e);
}
} else {
throw new IllegalArgumentException("Unknown status: " + status);
}
}
@Override
public String toString() {
return "SynchronizationAdapter{" +
"localTransaction=" + localTransaction +
"} " + super.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SynchronizationAdapter that = (SynchronizationAdapter) o;
if (localTransaction != null ? !localTransaction.equals(that.localTransaction) : that.localTransaction != null)
return false;
return true;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy