update seata 1.5.2 => 1.6.0 适配升级
parent
0bb385f6cf
commit
efc4bf5a0a
Binary file not shown.
@ -1,107 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2019 Seata.io Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package io.seata.integration.dubbo;
|
||||
|
||||
import io.seata.common.util.StringUtils;
|
||||
import io.seata.core.constants.DubboConstants;
|
||||
import io.seata.core.context.RootContext;
|
||||
import io.seata.core.model.BranchType;
|
||||
import org.apache.dubbo.common.extension.Activate;
|
||||
import org.apache.dubbo.rpc.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* The type Transaction propagation filter.
|
||||
*
|
||||
* @author sharajava
|
||||
*/
|
||||
@Activate(group = {DubboConstants.PROVIDER, DubboConstants.CONSUMER}, order = 100)
|
||||
public class ApacheDubboTransactionPropagationFilter implements Filter {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ApacheDubboTransactionPropagationFilter.class);
|
||||
|
||||
@Override
|
||||
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
||||
String xid = RootContext.getXID();
|
||||
BranchType branchType = RootContext.getBranchType();
|
||||
|
||||
String rpcXid = getRpcXid();
|
||||
String rpcBranchType = RpcContext.getServiceContext().getAttachment(RootContext.KEY_BRANCH_TYPE);
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("xid in RootContext[{}] xid in RpcContext[{}]", xid, rpcXid);
|
||||
}
|
||||
boolean bind = false;
|
||||
if (xid != null) {
|
||||
RpcContext.getServiceContext().setAttachment(RootContext.KEY_XID, xid);
|
||||
RpcContext.getServiceContext().setAttachment(RootContext.KEY_BRANCH_TYPE, branchType.name());
|
||||
} else {
|
||||
if (rpcXid != null) {
|
||||
RootContext.bind(rpcXid);
|
||||
if (StringUtils.equals(BranchType.TCC.name(), rpcBranchType)) {
|
||||
RootContext.bindBranchType(BranchType.TCC);
|
||||
}
|
||||
bind = true;
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("bind xid [{}] branchType [{}] to RootContext", rpcXid, rpcBranchType);
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
return invoker.invoke(invocation);
|
||||
} finally {
|
||||
if (bind) {
|
||||
BranchType previousBranchType = RootContext.getBranchType();
|
||||
String unbindXid = RootContext.unbind();
|
||||
if (BranchType.TCC == previousBranchType) {
|
||||
RootContext.unbindBranchType();
|
||||
}
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("unbind xid [{}] branchType [{}] from RootContext", unbindXid, previousBranchType);
|
||||
}
|
||||
if (!rpcXid.equalsIgnoreCase(unbindXid)) {
|
||||
LOGGER.warn("xid in change during RPC from {} to {},branchType from {} to {}", rpcXid, unbindXid,
|
||||
rpcBranchType != null ? rpcBranchType : "AT", previousBranchType);
|
||||
if (unbindXid != null) {
|
||||
RootContext.bind(unbindXid);
|
||||
LOGGER.warn("bind xid [{}] back to RootContext", unbindXid);
|
||||
if (BranchType.TCC == previousBranchType) {
|
||||
RootContext.bindBranchType(BranchType.TCC);
|
||||
LOGGER.warn("bind branchType [{}] back to RootContext", previousBranchType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RpcContext.getServiceContext().removeAttachment(RootContext.KEY_XID);
|
||||
RpcContext.getServiceContext().removeAttachment(RootContext.KEY_BRANCH_TYPE);
|
||||
RpcContext.getServerContext().removeAttachment(RootContext.KEY_XID);
|
||||
RpcContext.getServerContext().removeAttachment(RootContext.KEY_BRANCH_TYPE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get rpc xid
|
||||
* @return
|
||||
*/
|
||||
private String getRpcXid() {
|
||||
String rpcXid = RpcContext.getServiceContext().getAttachment(RootContext.KEY_XID);
|
||||
if (rpcXid == null) {
|
||||
rpcXid = RpcContext.getServiceContext().getAttachment(RootContext.KEY_XID.toLowerCase());
|
||||
}
|
||||
return rpcXid;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 1999-2019 Seata.io Group.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package io.seata.server.session;
|
||||
|
||||
import io.seata.core.model.GlobalStatus;
|
||||
|
||||
/**
|
||||
* The type change status validator.
|
||||
*
|
||||
* @author Bughue
|
||||
*/
|
||||
public class SessionStatusValidator {
|
||||
|
||||
/**
|
||||
* is timeout global status
|
||||
*
|
||||
* @param status the global session
|
||||
*/
|
||||
public static boolean isTimeoutGlobalStatus(GlobalStatus status) {
|
||||
return status == GlobalStatus.TimeoutRollbacked
|
||||
|| status == GlobalStatus.TimeoutRollbackFailed
|
||||
|| status == GlobalStatus.TimeoutRollbacking
|
||||
|| status == GlobalStatus.TimeoutRollbackRetrying;
|
||||
}
|
||||
|
||||
/**
|
||||
* is rollback global status
|
||||
*
|
||||
* @param status the global session
|
||||
*/
|
||||
public static boolean isRollbackGlobalStatus(GlobalStatus status) {
|
||||
return status == GlobalStatus.Rollbacking
|
||||
|| status == GlobalStatus.RollbackRetrying
|
||||
|| status == GlobalStatus.Rollbacked
|
||||
|| status == GlobalStatus.RollbackFailed
|
||||
|| status == GlobalStatus.RollbackRetryTimeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* is commit global status
|
||||
*
|
||||
* @param status the global session
|
||||
*/
|
||||
public static boolean isCommitGlobalStatus(GlobalStatus status) {
|
||||
return status == GlobalStatus.Committing
|
||||
|| status == GlobalStatus.AsyncCommitting
|
||||
|| status == GlobalStatus.CommitRetrying
|
||||
|| status == GlobalStatus.Committed
|
||||
|| status == GlobalStatus.CommitFailed
|
||||
|| status == GlobalStatus.CommitRetryTimeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* check the relation of before status and after status
|
||||
*
|
||||
* @param before the global session
|
||||
* @param after the global session
|
||||
*/
|
||||
public static boolean validateUpdateStatus(GlobalStatus before, GlobalStatus after) {
|
||||
if (isTimeoutGlobalStatus(before) && isCommitGlobalStatus(after)) {
|
||||
return false;
|
||||
}
|
||||
if (isCommitGlobalStatus(before) && isTimeoutGlobalStatus(after)) {
|
||||
return false;
|
||||
}
|
||||
if (isRollbackGlobalStatus(before) && isCommitGlobalStatus(after)) {
|
||||
return false;
|
||||
}
|
||||
if (isCommitGlobalStatus(before) && isRollbackGlobalStatus(after)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue