diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index dcc0b28c..24ca0622 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -39,47 +39,58 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory .getLogger(SeataHandlerInterceptor.class); + + public static final String BIND_XID = "BIND_XID"; + + public static final String UNBIND_XID = "UNBIND_XID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + Object xid_status = request.getAttribute(BIND_XID); + if (null == xid_status || !(boolean)xid_status) { + String xid = RootContext.getXID(); + String rpcXid = request.getHeader(RootContext.KEY_XID); + if (log.isDebugEnabled()) { + log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); + } - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } - - if (xid == null && rpcXid != null) { - RootContext.bind(rpcXid); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } - } - return true; + if (xid == null && rpcXid != null) { + RootContext.bind(rpcXid); + request.setAttribute(BIND_XID, true); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); + } + } + } + return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { - String rpcXid = request.getHeader(RootContext.KEY_XID); + String rpcXid = request.getHeader(RootContext.KEY_XID); - if (StringUtils.isEmpty(rpcXid)) { - return; - } + if (StringUtils.isEmpty(rpcXid)) { + return; + } - String unbindXid = RootContext.unbind(); - if (log.isDebugEnabled()) { - log.debug("unbind {} from RootContext", unbindXid); - } - if (!rpcXid.equalsIgnoreCase(unbindXid)) { - log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); - if (unbindXid != null) { - RootContext.bind(unbindXid); - log.warn("bind {} back to RootContext", unbindXid); - } - } - } + Object xid_status = request.getAttribute(UNBIND_XID); + if (null == xid_status || !(boolean)xid_status) { + String unbindXid = RootContext.unbind(); + if (log.isDebugEnabled()) { + log.debug("unbind {} from RootContext", unbindXid); + } + if (!rpcXid.equalsIgnoreCase(unbindXid)) { + log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); + if (unbindXid != null) { + RootContext.bind(unbindXid); + request.setAttribute(UNBIND_XID, true); + log.warn("bind {} back to RootContext", unbindXid); + } + } + } + } }