1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00

judging xid status to avoid repeated processing

This commit is contained in:
FUNKYE 2020-04-22 22:10:30 +08:00
parent 742d84bc53
commit d383fb4677

View File

@ -39,47 +39,58 @@ public class SeataHandlerInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory private static final Logger log = LoggerFactory
.getLogger(SeataHandlerInterceptor.class); .getLogger(SeataHandlerInterceptor.class);
public static final String BIND_XID = "BIND_XID";
public static final String UNBIND_XID = "UNBIND_XID";
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) { 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(); if (xid == null && rpcXid != null) {
String rpcXid = request.getHeader(RootContext.KEY_XID); RootContext.bind(rpcXid);
if (log.isDebugEnabled()) { request.setAttribute(BIND_XID, true);
log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); if (log.isDebugEnabled()) {
} log.debug("bind {} to RootContext", rpcXid);
}
if (xid == null && rpcXid != null) { }
RootContext.bind(rpcXid); }
if (log.isDebugEnabled()) { return true;
log.debug("bind {} to RootContext", rpcXid);
}
}
return true;
} }
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception e) { Object handler, Exception e) {
String rpcXid = request.getHeader(RootContext.KEY_XID); String rpcXid = request.getHeader(RootContext.KEY_XID);
if (StringUtils.isEmpty(rpcXid)) { if (StringUtils.isEmpty(rpcXid)) {
return; return;
} }
String unbindXid = RootContext.unbind(); Object xid_status = request.getAttribute(UNBIND_XID);
if (log.isDebugEnabled()) { if (null == xid_status || !(boolean)xid_status) {
log.debug("unbind {} from RootContext", unbindXid); String unbindXid = RootContext.unbind();
} if (log.isDebugEnabled()) {
if (!rpcXid.equalsIgnoreCase(unbindXid)) { log.debug("unbind {} from RootContext", unbindXid);
log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); }
if (unbindXid != null) { if (!rpcXid.equalsIgnoreCase(unbindXid)) {
RootContext.bind(unbindXid); log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid);
log.warn("bind {} back to RootContext", unbindXid); if (unbindXid != null) {
} RootContext.bind(unbindXid);
} request.setAttribute(UNBIND_XID, true);
} log.warn("bind {} back to RootContext", unbindXid);
}
}
}
}
} }