This is an automated email from the ASF dual-hosted git repository.

sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 46a2fb0fc59 Use RootSpanContext to instead of ExecutorDataMap for root 
span thread-crossed passing for zipkin (#23682)
46a2fb0fc59 is described below

commit 46a2fb0fc5963dda10324211b5ddb83864b23c06
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jan 20 23:45:41 2023 +0800

    Use RootSpanContext to instead of ExecutorDataMap for root span 
thread-crossed passing for zipkin (#23682)
    
    * Use RootSpanContext to instead of DataMap for root span thread-crossed 
passing for zipkin
    
    * Use RootSpanContext to instead of DataMap for root span thread-crossed 
passing for zipkin
    
    * Add executor test case
    
    * Add transmittable-thread-local dependency
    
    * Use transmittable-thread-local on zipkin
---
 .../advice/ZipkinCommandExecutorTaskAdvice.java    |  8 +--
 .../advice/ZipkinJDBCExecutorCallbackAdvice.java   |  7 +--
 .../zipkin/advice/ZipkinSQLParserEngineAdvice.java |  6 +--
 .../tracing/zipkin/constant/ZipkinConstants.java   |  2 -
 .../tracing/zipkin/span/RootSpanContext.java       | 58 +++++++++++++++++++++
 .../ZipkinJDBCExecutorCallbackAdviceTest.java      |  6 ---
 .../advice/ZipkinSQLParserEngineAdviceTest.java    | 11 ++--
 .../proxy-native/src/main/release-docs/LICENSE     |  1 +
 distribution/proxy/src/main/release-docs/LICENSE   |  1 +
 infra/executor/pom.xml                             |  5 ++
 .../kernel/thread/ExecutorServiceManager.java      |  3 +-
 .../thread/ExecutorThreadFactoryBuilder.java       | 11 ----
 .../kernel/thread/ExecutorServiceManagerTest.java  | 59 ++++++++++++++++++++++
 .../thread/ExecutorThreadFactoryBuilderTest.java   | 11 ----
 pom.xml                                            |  6 +++
 15 files changed, 146 insertions(+), 49 deletions(-)

diff --git 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
index ae7aeb15b83..7b96a44c936 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinCommandExecutorTaskAdvice.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
 import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtil;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
 import org.apache.shardingsphere.proxy.backend.communication.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
@@ -40,19 +40,19 @@ public final class ZipkinCommandExecutorTaskAdvice 
implements InstanceMethodAdvi
     public void beforeMethod(final TargetAdviceObject target, final Method 
method, final Object[] args, final String pluginType) {
         Span span = Tracing.currentTracer().newTrace().name(OPERATION_NAME);
         span.tag(ZipkinConstants.Tags.COMPONENT, 
ZipkinConstants.COMPONENT_NAME).kind(Span.Kind.CLIENT).tag(ZipkinConstants.Tags.DB_TYPE,
 ZipkinConstants.DB_TYPE_VALUE).start();
-        ExecutorDataMap.getValue().put(ZipkinConstants.ROOT_SPAN, span);
+        RootSpanContext.set(span);
     }
     
     @Override
     public void afterMethod(final TargetAdviceObject target, final Method 
method, final Object[] args, final Object result, final String pluginType) {
         BackendConnection connection = 
AgentReflectionUtil.<ConnectionSession>getFieldValue(target, 
"connectionSession").getBackendConnection();
-        Span span = (Span) 
ExecutorDataMap.getValue().remove(ZipkinConstants.ROOT_SPAN);
+        Span span = RootSpanContext.get();
         span.tag(ZipkinConstants.Tags.CONNECTION_COUNT, 
String.valueOf(connection.getConnectionSize()));
         span.finish();
     }
     
     @Override
     public void onThrowing(final TargetAdviceObject target, final Method 
method, final Object[] args, final Throwable throwable, final String 
pluginType) {
-        ((Span) 
ExecutorDataMap.getValue().get(ZipkinConstants.ROOT_SPAN)).error(throwable);
+        RootSpanContext.<Span>get().error(throwable);
     }
 }
diff --git 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
index 971cf245142..99d3ffa5f8a 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdvice.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
 import org.apache.shardingsphere.agent.plugin.core.util.AgentReflectionUtil;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
+import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
@@ -43,10 +44,10 @@ public final class ZipkinJDBCExecutorCallbackAdvice 
implements InstanceMethodAdv
     
     @Override
     @SneakyThrows({ReflectiveOperationException.class, SQLException.class})
-    @SuppressWarnings("unchecked")
     public void beforeMethod(final TargetAdviceObject target, final Method 
method, final Object[] args, final String pluginType) {
-        Span root = (Span) ((Map<String, Object>) 
args[2]).get(ZipkinConstants.ROOT_SPAN);
-        Span span = null == root ? 
Tracing.currentTracer().nextSpan().name(OPERATION_NAME) : 
Tracing.currentTracer().newChild(root.context()).name(OPERATION_NAME);
+        Span span = RootSpanContext.isEmpty()
+                ? Tracing.currentTracer().nextSpan().name(OPERATION_NAME)
+                : 
Tracing.currentTracer().newChild(RootSpanContext.<Span>get().context()).name(OPERATION_NAME);
         span.tag(ZipkinConstants.Tags.COMPONENT, 
ZipkinConstants.COMPONENT_NAME);
         span.tag(ZipkinConstants.Tags.DB_TYPE, ZipkinConstants.DB_TYPE_VALUE);
         JDBCExecutionUnit executionUnit = (JDBCExecutionUnit) args[0];
diff --git 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
index 8ad9ca7ef9d..3e7c0985b85 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdvice.java
@@ -19,11 +19,10 @@ package 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
 
 import brave.Span;
 import brave.Tracing;
-import brave.propagation.TraceContext;
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
 import org.apache.shardingsphere.agent.api.advice.type.InstanceMethodAdvice;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
 
 import java.lang.reflect.Method;
 
@@ -36,8 +35,7 @@ public final class ZipkinSQLParserEngineAdvice implements 
InstanceMethodAdvice {
     
     @Override
     public void beforeMethod(final TargetAdviceObject target, final Method 
method, final Object[] args, final String pluginType) {
-        TraceContext parentContext = ((Span) 
ExecutorDataMap.getValue().get(ZipkinConstants.ROOT_SPAN)).context();
-        Span span = 
Tracing.currentTracer().newChild(parentContext).name(OPERATION_NAME);
+        Span span = 
Tracing.currentTracer().newChild(RootSpanContext.<Span>get().context()).name(OPERATION_NAME);
         span.tag(ZipkinConstants.Tags.COMPONENT, 
ZipkinConstants.COMPONENT_NAME);
         span.tag(ZipkinConstants.Tags.DB_TYPE, ZipkinConstants.DB_TYPE_VALUE);
         span.tag(ZipkinConstants.Tags.DB_STATEMENT, String.valueOf(args[0]));
diff --git 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
index 71fb81442c9..966f5aa47a0 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
@@ -28,8 +28,6 @@ public final class ZipkinConstants {
     
     public static final String COMPONENT_NAME = "shardingsphere";
     
-    public static final String ROOT_SPAN = "zipkin_root_span";
-    
     public static final String DB_TYPE_VALUE = "shardingsphere-proxy";
     
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
diff --git 
a/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
new file mode 100644
index 00000000000..c24b1d400d0
--- /dev/null
+++ 
b/agent/plugins/tracing/type/zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/span/RootSpanContext.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.shardingsphere.agent.plugin.tracing.zipkin.span;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+
+/**
+ * Root span context.
+ */
+public final class RootSpanContext {
+    
+    private static final TransmittableThreadLocal<Object> VALUE = new 
TransmittableThreadLocal<>();
+    
+    /**
+     * Judge whether empty root span.
+     * 
+     * @return empty span or not
+     */
+    public static boolean isEmpty() {
+        return null == VALUE.get();
+    }
+    
+    /**
+     * Get root span.
+     * 
+     * @param <T> type of span
+     * @return root span
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T get() {
+        return (T) VALUE.get();
+    }
+    
+    /**
+     * Set root span.
+     * 
+     * @param value root span
+     * @param <T> type of span
+     */
+    public static <T> void set(final T value) {
+        VALUE.set(value);
+    }
+}
diff --git 
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
 
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
index e6d1bcf922d..cee26964005 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinJDBCExecutorCallbackAdviceTest.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
 import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractJDBCExecutorCallbackAdviceTest;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.collector.ZipkinCollector;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 import zipkin2.Span;
@@ -37,11 +36,6 @@ public final class ZipkinJDBCExecutorCallbackAdviceTest 
extends AbstractJDBCExec
     @ClassRule
     public static final ZipkinCollector COLLECTOR = new ZipkinCollector();
     
-    @Before
-    public void setup() {
-        getExtraMap().put(ZipkinConstants.ROOT_SPAN, null);
-    }
-    
     @Test
     public void assertMethod() {
         ZipkinJDBCExecutorCallbackAdvice advice = new 
ZipkinJDBCExecutorCallbackAdvice();
diff --git 
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
 
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
index 738dafad848..1587691fd6d 100644
--- 
a/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
+++ 
b/agent/plugins/tracing/type/zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/ZipkinSQLParserEngineAdviceTest.java
@@ -22,7 +22,7 @@ import brave.Tracing;
 import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractSQLParserEngineAdviceTest;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.collector.ZipkinCollector;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.span.RootSpanContext;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -43,12 +43,9 @@ public final class ZipkinSQLParserEngineAdviceTest extends 
AbstractSQLParserEngi
     
     private ZipkinSQLParserEngineAdvice advice;
     
-    private Span parentSpan;
-    
     @Before
     public void setup() {
-        parentSpan = Tracing.currentTracer().newTrace().name("parent").start();
-        ExecutorDataMap.getValue().put(ZipkinConstants.ROOT_SPAN, parentSpan);
+        
RootSpanContext.set(Tracing.currentTracer().newTrace().name("parent").start());
         advice = new ZipkinSQLParserEngineAdvice();
     }
     
@@ -56,7 +53,7 @@ public final class ZipkinSQLParserEngineAdviceTest extends 
AbstractSQLParserEngi
     public void assertMethod() {
         advice.beforeMethod(getTargetObject(), null, new 
Object[]{SQL_STATEMENT, true}, "Zipkin");
         advice.afterMethod(getTargetObject(), null, new 
Object[]{SQL_STATEMENT, true}, null, "Zipkin");
-        parentSpan.finish();
+        RootSpanContext.<Span>get().finish();
         zipkin2.Span span = COLLECTOR.pop();
         assertNotNull(span.parentId());
         Map<String, String> tags = span.tags();
@@ -69,7 +66,7 @@ public final class ZipkinSQLParserEngineAdviceTest extends 
AbstractSQLParserEngi
         advice.beforeMethod(getTargetObject(), null, new 
Object[]{SQL_STATEMENT, true}, "Zipkin");
         advice.onThrowing(getTargetObject(), null, new Object[]{SQL_STATEMENT, 
true}, new IOException(), "Zipkin");
         advice.afterMethod(getTargetObject(), null, new 
Object[]{SQL_STATEMENT, true}, null, "Zipkin");
-        parentSpan.finish();
+        RootSpanContext.<Span>get().finish();
         zipkin2.Span span = COLLECTOR.pop();
         assertNotNull(span.parentId());
         Map<String, String> tags = span.tags();
diff --git a/distribution/proxy-native/src/main/release-docs/LICENSE 
b/distribution/proxy-native/src/main/release-docs/LICENSE
index d05f7ebe370..7ab7c219f02 100644
--- a/distribution/proxy-native/src/main/release-docs/LICENSE
+++ b/distribution/proxy-native/src/main/release-docs/LICENSE
@@ -288,6 +288,7 @@ The text of each license is the standard Apache 2.0 license.
     quartz 2.3.2: https://github.com/quartz-scheduler/quartz, Apache 2.0
     sketches-core 0.9.0, Apache 2.0
     snakeyaml 1.33: https://bitbucket.org/snakeyaml/snakeyaml, Apache 2.0
+    transmittable-thread-local 2.14.2: 
https://github.com/alibaba/transmittable-thread-local, Apache 2.0
     uzaygezen-core 0.2: https://code.google.com/p/uzaygezen, Apache 2.0
     zookeeper 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
     zookeeper-jute 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
diff --git a/distribution/proxy/src/main/release-docs/LICENSE 
b/distribution/proxy/src/main/release-docs/LICENSE
index e753e8d671b..29e54d10e52 100644
--- a/distribution/proxy/src/main/release-docs/LICENSE
+++ b/distribution/proxy/src/main/release-docs/LICENSE
@@ -290,6 +290,7 @@ The text of each license is the standard Apache 2.0 license.
     quartz 2.3.2: https://github.com/quartz-scheduler/quartz, Apache 2.0
     sketches-core 0.9.0, Apache 2.0
     snakeyaml 1.33: https://bitbucket.org/snakeyaml/snakeyaml, Apache 2.0
+    transmittable-thread-local 2.14.2: 
https://github.com/alibaba/transmittable-thread-local, Apache 2.0
     uzaygezen-core 0.2: https://code.google.com/p/uzaygezen, Apache 2.0
     zookeeper 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
     zookeeper-jute 3.8.0: https://github.com/apache/zookeeper, Apache 2.0
diff --git a/infra/executor/pom.xml b/infra/executor/pom.xml
index 5a542c96b88..c9893c548c3 100644
--- a/infra/executor/pom.xml
+++ b/infra/executor/pom.xml
@@ -45,5 +45,10 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>transmittable-thread-local</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
index 0abe5b5df86..135830b1575 100644
--- 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
+++ 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManager.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.executor.kernel.thread;
 
+import com.alibaba.ttl.threadpool.TtlExecutors;
 import lombok.Getter;
 
 import java.util.concurrent.ExecutorService;
@@ -41,7 +42,7 @@ public final class ExecutorServiceManager {
     }
     
     public ExecutorServiceManager(final int executorSize, final String 
nameFormat) {
-        executorService = getExecutorService(executorSize, nameFormat);
+        executorService = 
TtlExecutors.getTtlExecutorService(getExecutorService(executorSize, 
nameFormat));
     }
     
     private ExecutorService getExecutorService(final int executorSize, final 
String nameFormat) {
diff --git 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
index 5b06e30a1e3..a2947dcc86b 100644
--- 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
+++ 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilder.java
@@ -31,17 +31,6 @@ public final class ExecutorThreadFactoryBuilder {
     
     private static final String NAME_FORMAT_PREFIX = "ShardingSphere-";
     
-    private static final String DEFAULT_EXECUTOR_NAME_FORMAT = 
NAME_FORMAT_PREFIX + "%d";
-    
-    /**
-     * Build default thread factory.
-     *
-     * @return default thread factory
-     */
-    public static ThreadFactory build() {
-        return new 
ThreadFactoryBuilder().setDaemon(true).setNameFormat(DEFAULT_EXECUTOR_NAME_FORMAT).build();
-    }
-    
     /**
      * Build thread factory with thread name format.
      * 
diff --git 
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
new file mode 100644
index 00000000000..4f1d7b78fbd
--- /dev/null
+++ 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorServiceManagerTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.shardingsphere.infra.executor.kernel.thread;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import org.junit.Test;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class ExecutorServiceManagerTest {
+    
+    private static final TransmittableThreadLocal<String> 
TRANSMITTABLE_THREAD_LOCAL = new TransmittableThreadLocal<>();
+    
+    @Test(timeout = 1000L)
+    public void assertThreadLocalValueChangedForReusedThread() throws 
InterruptedException {
+        AtomicBoolean finished = new AtomicBoolean(false);
+        ExecutorService executorService = new 
ExecutorServiceManager(1).getExecutorService();
+        executorService.submit(() -> {
+            TRANSMITTABLE_THREAD_LOCAL.set("foo");
+            executorService.submit(() -> 
assertThat(TRANSMITTABLE_THREAD_LOCAL.get(), is("foo")));
+        });
+        TRANSMITTABLE_THREAD_LOCAL.set("bar");
+        executorService.submit(() -> {
+            assertValueChangedInConcurrencyThread();
+            finished.set(true);
+        });
+        while (!finished.get()) {
+            Thread.sleep(100L);
+        }
+    }
+    
+    private void assertValueChangedInConcurrencyThread() {
+        try {
+            assertThat(TRANSMITTABLE_THREAD_LOCAL.get(), is("bar"));
+        } catch (final AssertionError ex) {
+            ex.printStackTrace();
+            throw ex;
+        }
+    }
+}
diff --git 
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
index e0a5ed9639f..cafd33941f9 100644
--- 
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
+++ 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/kernel/thread/ExecutorThreadFactoryBuilderTest.java
@@ -26,17 +26,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 public final class ExecutorThreadFactoryBuilderTest {
     
-    @Test
-    public void assertBuild() {
-        ThreadFactory threadFactory = ExecutorThreadFactoryBuilder.build();
-        Thread thread0 = threadFactory.newThread(() -> {
-        });
-        assertThat(thread0.getName(), is("ShardingSphere-0"));
-        Thread thread1 = threadFactory.newThread(() -> {
-        });
-        assertThat(thread1.getName(), is("ShardingSphere-1"));
-    }
-    
     @Test
     public void assertBuildWithNameFormat() {
         ThreadFactory threadFactory = 
ExecutorThreadFactoryBuilder.build("test");
diff --git a/pom.xml b/pom.xml
index 178024903ee..94f4c3fd940 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,6 +63,7 @@
         <commons-lang3.version>3.12.0</commons-lang3.version>
         <commons-collections4.version>4.4</commons-collections4.version>
         <commons-codec.version>1.15</commons-codec.version>
+        
<transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
         
         <antlr4.version>4.9.2</antlr4.version>
         <snakeyaml.version>1.33</snakeyaml.version>
@@ -182,6 +183,11 @@
                 <artifactId>commons-codec</artifactId>
                 <version>${commons-codec.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>transmittable-thread-local</artifactId>
+                <version>${transmittable-thread-local.version}</version>
+            </dependency>
             
             <dependency>
                 <groupId>org.antlr</groupId>

Reply via email to