/**
* Copyright 2014-2016 yangming.liu<bytefox@126.com>.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program 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. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, see <http://www.gnu.org/licenses/>.
*/
package org.bytesoft.bytetcc;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.Synchronization;
import javax.transaction.SystemException;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import org.apache.commons.lang3.StringUtils;
import org.bytesoft.bytejta.supports.jdbc.RecoveredResource;
import org.bytesoft.bytejta.supports.resource.RemoteResourceDescriptor;
import org.bytesoft.bytetcc.supports.CompensableRolledbackMarker;
import org.bytesoft.bytetcc.supports.resource.LocalResourceCleaner;
import org.bytesoft.common.utils.ByteUtils;
import org.bytesoft.common.utils.CommonUtils;
import org.bytesoft.compensable.CompensableBeanFactory;
import org.bytesoft.compensable.CompensableInvocation;
import org.bytesoft.compensable.CompensableTransaction;
import org.bytesoft.compensable.ContainerContext;
import org.bytesoft.compensable.TransactionContext;
import org.bytesoft.compensable.archive.CompensableArchive;
import org.bytesoft.compensable.archive.TransactionArchive;
import org.bytesoft.compensable.logging.CompensableLogger;
import org.bytesoft.transaction.CommitRequiredException;
import org.bytesoft.transaction.RollbackRequiredException;
import org.bytesoft.transaction.Transaction;
import org.bytesoft.transaction.TransactionRepository;
import org.bytesoft.transaction.archive.XAResourceArchive;
import org.bytesoft.transaction.remote.RemoteCoordinator;
import org.bytesoft.transaction.remote.RemoteNode;
import org.bytesoft.transaction.remote.RemoteSvc;
import org.bytesoft.transaction.supports.TransactionExtra;
import org.bytesoft.transaction.supports.TransactionListener;
import org.bytesoft.transaction.supports.TransactionListenerAdapter;
import org.bytesoft.transaction.supports.TransactionResourceListener;
import org.bytesoft.transaction.supports.resource.XAResourceDescriptor;
import org.bytesoft.transaction.supports.serialize.XAResourceDeserializer;
import org.bytesoft.transaction.xa.TransactionXid;
import org.bytesoft.transaction.xa.XidFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CompensableTransactionImpl extends TransactionListenerAdapter
implements CompensableTransaction, CompensableRolledbackMarker {
static final Logger logger = LoggerFactory.getLogger(CompensableTransactionImpl.class);
private final TransactionContext transactionContext;
private final List<CompensableArchive> archiveList = new ArrayList<CompensableArchive>();
private final Map<RemoteSvc, XAResourceArchive> resourceMap = new HashMap<RemoteSvc, XAResourceArchive>();
private final List<XAResourceArchive> resourceList = new ArrayList<XAResourceArchive>();
private final Map<Thread, Transaction> transactionMap = new ConcurrentHashMap<Thread, Transaction>();
private CompensableBeanFactory beanFactory;
private int transactionVote;
private int transactionStatus = Status.STATUS_ACTIVE;
/* current compensable-decision in confirm/cancel phase. */
private transient Boolean positive;
/* current compensable-archive in confirm/cancel phase. */
private transient CompensableArchive archive;
private transient final Map<Xid, List<CompensableArchive>> xidToArchivesMap = new HashMap<Xid, List<CompensableArchive>>();
private transient final Map<Xid, TransactionBranch> xidToBranchMap = new HashMap<Xid, TransactionBranch>();
private Map<String, Serializable> variables = new HashMap<String, Serializable>();
private Thread currentThread;
private final Lock lock = new ReentrantLock();
private transient Exception createdAt;
public CompensableTransactionImpl(TransactionContext txContext) {
this.transactionContext = txContext;
}
public TransactionArchive getTransactionArchive() {
TransactionArchive transactionArchive = new TransactionArchive();
transactionArchive.setVariables(this.variables);
transactionArchive.setCoordinator(this.transactionContext.isCoordinator());
transactionArchive.setPropagated(this.transactionContext.isPropagated());
transactionArchive.setCompensable(this.transactionContext.isCompensable());
transactionArchive.setCompensableStatus(this.transactionStatus);
transactionArchive.setVote(this.transactionVote);
transactionArchive.setXid(this.transactionContext.getXid());
transactionArchive.getRemoteResources().addAll(this.resourceList);
transactionArchive.getCompensableResourceList().addAll(this.archiveList);
transactionArchive.setPropagatedBy(this.transactionContext.getPropagatedBy());
transactionArchive.setRecoveredAt(this.transactionContext.getCreatedTime());
transactionArchive.setRecoveredTimes(this.transactionContext.getRecoveredTimes());
return transactionArchive;
}
public synchronized void participantCommit(boolean opc) throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, CommitRequiredException, SystemException {
// Recover if transaction is recovered from tx-log.
this.recoverIfNecessary();
if (this.transactionStatus != Status.STATUS_COMMITTED) {
this.fireCommit(); // TODO
}
}
public synchronized void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
SecurityException, IllegalStateException, SystemException {
if (this.transactionStatus == Status.STATUS_ACTIVE) {
this.fireCommit();
} else if (this.transactionStatus == Status.STATUS_MARKED_ROLLBACK) {
this.fireRollback();
throw new HeuristicRollbackException();
} else if (this.transactionStatus == Status.STATUS_ROLLEDBACK) /* should never happen */ {
throw new RollbackException();
} else if (this.transactionStatus == Status.STATUS_COMMITTED) /* should never happen */ {
logger.debug("Current transaction has already been committed.");
} else {
throw new IllegalStateException();
}
}
private void fireCommit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException,
IllegalStateException, SystemException {
CompensableLogger compensableLogger = this.beanFactory.getCompensableLogger();
this.transactionContext.setCompensating(true);
this.transactionStatus = Status.STATUS_COMMITTING;
compensableLogger.updateTransactionStatus(this.getTransactionArchive()); // compensableLogger.updateTransaction(this.getTransactionArchive());
SystemException systemEx = null;
try {
this.fireNativeParticipantConfirm();
} catch (SystemException ex) {
systemEx = ex;
logger.info("{}| confirm native branchs failed!",
ByteUtils.byteArrayToString(this.transactionContext.getXid().getGlobalTransactionId()), ex);
} catch (RuntimeException ex) {
systemEx = new SystemException(XAException.XAER_RMERR);
systemEx.initCause(ex);
logger.info("{}| confirm native branchs failed!",
ByteUtils.byteArrayToString(
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
ByteTCC Transaction Manager旨在提供一个兼容JTA的基于TCC机制的分布式事务管理器。兼容JTA,可以很好的与EJB、Spring等容器(本文档下文说明中将以Spring容器为例)进行集成。
资源推荐
资源详情
资源评论
收起资源包目录
ByteTCC Transaction Manager旨在提供一个兼容JTA的基于TCC机制的分布式事务管理器 (160个子文件)
com.alibaba.dubbo.rpc.Filter 72B
.gitignore 669B
org.bytesoft.bytetcc.supports.dubbo.ext.ILoadBalancer 71B
CompensableTransactionImpl.java 55KB
CompensablePrimaryFilter.java 37KB
MongoCompensableLogger.java 33KB
CompensableSecondaryFilter.java 32KB
CompensableManagerImpl.java 29KB
TransactionRecoveryImpl.java 23KB
MongoCompensableLock.java 20KB
MongoCompensableRepository.java 19KB
CompensableCoordinator.java 17KB
CleanupFile.java 17KB
SpringCloudConfiguration.java 15KB
SpringCloudSecondaryConfiguration.java 15KB
SampleCompensableLogger.java 14KB
UserCompensableImpl.java 14KB
CompensableAnnotationConfigValidator.java 13KB
TransactionManagerImpl.java 13KB
ServiceResponseWrapFilter.java 12KB
CompensableMethodInterceptor.java 12KB
SpringBootCoordinator.java 11KB
CompensableArchiveDeserializer.java 11KB
CompensableBeanConfigValidator.java 11KB
TransactionArchiveDeserializer.java 11KB
SpringCloudCoordinator.java 10KB
SpringContainerContextImpl.java 10KB
CompensableLoadBalance.java 10KB
HttpServletResponseImpl.java 10KB
CleanupWork.java 9KB
CompensableHandlerInterceptor.java 9KB
CompensableRequestInterceptor.java 9KB
CompensableHystrixBeanPostProcessor.java 9KB
CompensableRequestInterceptor.java 8KB
SpringBootConfiguration.java 8KB
CompensableHandlerInterceptor.java 8KB
CompensableCleanupWork.java 8KB
SpringBootSecondaryConfiguration.java 8KB
CompensableCoordinatorController.java 8KB
CompensableInterceptorImpl.java 8KB
TransactionBeanFactoryImpl.java 8KB
CompensableEndpointAutoInjector.java 7KB
CompensableHystrixMethodHandler.java 7KB
CompensableFeignDecoder.java 7KB
TransactionCoordinator.java 6KB
XAResourceDeserializerImpl.java 6KB
CompensableCoordinatorController.java 6KB
CompensableFeignErrorDecoder.java 6KB
CompensableParticipantRegistrant.java 6KB
XAResourceArchiveDeserializer.java 6KB
CompensableFeignHandler.java 6KB
SpringCloudBeanRegistry.java 5KB
CompensableLoadBalancerInterceptor.java 5KB
CompensableInterceptorImpl.java 5KB
DubboSupportConfiguration.java 5KB
XAResourceDeserializerImpl.java 4KB
ArchiveDeserializerImpl.java 4KB
DubboSecondaryConfiguration.java 4KB
SpringCloudEndpointPostProcessor.java 4KB
SpringBootEndpointPostProcessor.java 4KB
XAResourceDeserializerImpl.java 4KB
CompensableFeignBeanPostProcessor.java 4KB
TransactionAdviceOrderStraightener.java 4KB
CompensableArchive.java 4KB
CompensableWork.java 4KB
CompensableInvocationImpl.java 4KB
CompensableLoadBalancerRuleImpl.java 4KB
SpringBootCompensableInterceptor.java 3KB
CompensableInterceptorImpl.java 3KB
SpringBootBeanRegistry.java 3KB
ServletOutputStreamImpl.java 3KB
CompensableFeignInterceptor.java 3KB
CompensableContextImpl.java 3KB
CompensableBeanFactoryAutoInjector.java 3KB
TransactionConfigDefinitionValidator.java 3KB
CompensableFeignContract.java 3KB
ServiceErrorResolver.java 3KB
CompensableInvocationInfo.java 3KB
CompensableContextAutoInjector.java 3KB
CompensableHystrixFeignHandler.java 3KB
LocalXADataSourcePostProcessor.java 3KB
CompensableServiceFilter.java 3KB
CompensableBeanFactory.java 3KB
CompensableBeanRegistry.java 3KB
CompensablePropertySource.java 2KB
CompensableStatistic.java 2KB
TransactionContext.java 2KB
CompensableRuleImpl.java 2KB
SpringContextRegistry.java 2KB
CleanupRecord.java 2KB
ServletInputStreamImpl.java 2KB
CompensableInvocationRegistry.java 2KB
CompensableLogger.java 2KB
TransactionArchive.java 2KB
CompensableFeignResult.java 2KB
UserCompensable.java 2KB
CompensableHystrixFallbackFactoryHandler.java 2KB
MongoCompensableRecovery.java 2KB
ServiceResponse.java 2KB
CompensableManager.java 2KB
共 160 条
- 1
- 2
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 信呼OA系统2.1.7版源码
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功