From d383fb4677b3d210521e417b228da2c5be2155a9 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:10:30 +0800 Subject: [PATCH 1/6] judging xid status to avoid repeated processing --- .../seata/web/SeataHandlerInterceptor.java | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) 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 dcc0b28c0..24ca06225 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); + } + } + } + } } From ea0d1d709d26c502863627473651c145d9365600 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:23:27 +0800 Subject: [PATCH 2/6] fix bug --- .../alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 24ca06225..5b83b71f6 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,10 +39,10 @@ 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"; + private static final String BIND_XID = "BIND_XID"; + + private static final String UNBIND_XID = "UNBIND_XID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, From 8fa763f7d6bf790f80e4b9f78a6a67da9f7afc22 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:26:37 +0800 Subject: [PATCH 3/6] fix bug --- .../alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 5b83b71f6..14b748763 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 @@ -47,8 +47,8 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - Object xid_status = request.getAttribute(BIND_XID); - if (null == xid_status || !(boolean)xid_status) { + Object xidStatus = request.getAttribute(BIND_XID); + if (null == xidStatus || !(boolean)xidStatus) { String xid = RootContext.getXID(); String rpcXid = request.getHeader(RootContext.KEY_XID); if (log.isDebugEnabled()) { @@ -76,8 +76,8 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { return; } - Object xid_status = request.getAttribute(UNBIND_XID); - if (null == xid_status || !(boolean)xid_status) { + Object xidStatus = request.getAttribute(UNBIND_XID); + if (null == xidStatus || !(boolean)xidStatus) { String unbindXid = RootContext.unbind(); if (log.isDebugEnabled()) { log.debug("unbind {} from RootContext", unbindXid); From fa588d65c8245f93c83cb28a3c0a151e05ce0033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=81=A5=E6=96=8C?= <364176773@qq.com> Date: Thu, 23 Apr 2020 13:32:24 +0800 Subject: [PATCH 4/6] optimize code --- .../seata/web/SeataHandlerInterceptor.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) 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 14b748763..fd064dd43 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 @@ -47,20 +47,17 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - Object xidStatus = request.getAttribute(BIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { - 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); - request.setAttribute(BIND_XID, true); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } + if (xid == null && rpcXid != null) { + RootContext.bind(rpcXid); + request.setAttribute(BIND_XID, true); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); } } return true; @@ -86,7 +83,6 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { 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); } } From 29cbc0bfbe5903d89a97781193ff96cde74ae2d3 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Tue, 12 May 2020 20:51:33 +0800 Subject: [PATCH 5/6] optimize code --- .../seata/web/SeataHandlerInterceptor.java | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) 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 14b748763..3b2def65b 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 @@ -19,11 +19,11 @@ package com.alibaba.cloud.seata.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import io.seata.common.util.StringUtils; import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; /** @@ -40,44 +40,33 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory .getLogger(SeataHandlerInterceptor.class); - private static final String BIND_XID = "BIND_XID"; - - private static final String UNBIND_XID = "UNBIND_XID"; - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object handler) { - Object xidStatus = request.getAttribute(BIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + 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); - request.setAttribute(BIND_XID, true); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } + if (StringUtils.isBlank(xid) && rpcXid != null) { + RootContext.bind(rpcXid); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); } } - return true; - } - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception e) { + return true; + } - String rpcXid = request.getHeader(RootContext.KEY_XID); + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { + if (StringUtils.isNotBlank(RootContext.getXID())) { + String rpcXid = request.getHeader(RootContext.KEY_XID); - if (StringUtils.isEmpty(rpcXid)) { - return; - } + if (StringUtils.isEmpty(rpcXid)) { + return; + } - Object xidStatus = request.getAttribute(UNBIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { String unbindXid = RootContext.unbind(); if (log.isDebugEnabled()) { log.debug("unbind {} from RootContext", unbindXid); @@ -86,7 +75,6 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { 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); } } From f8fe4cb9a123f355d5a5ce9b3dd82cefda7213d5 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Tue, 12 May 2020 20:57:41 +0800 Subject: [PATCH 6/6] Merge branch 'fix_unbind_xid_null' of github.com:a364176773/spring-cloud-alibaba into fix_unbind_xid_null --- .../com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 1 + 1 file changed, 1 insertion(+) 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 3b2def65b..86d331b05 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 @@ -58,6 +58,7 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { return true; } + @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { if (StringUtils.isNotBlank(RootContext.getXID())) {