diff --git a/pom.xml b/pom.xml
index d63fbf73ce..d005ec0f10 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,7 @@
2.0.0-SNAPSHOT
3.12.4
1.8
+ 1.18.24
true
false
true
@@ -66,9 +67,10 @@
0.8.8
UTF-8
UTF-8
- 3.6.1
+ 3.8.1
3.0.0
3.0.1
+ 3.2.0
3.0.2
1.1.0
1.6
@@ -82,6 +84,11 @@
+
+ org.projectlombok
+ lombok
+ ${lombok-version}
+
cn.hippo4j
hippo4j-dependencies
@@ -125,6 +132,7 @@
org.apache.maven.plugins
maven-jar-plugin
+ ${maven.jar.plugin.version}
@@ -136,6 +144,11 @@
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ ${maven.resources.plugin.version}
+
org.codehaus.mojo
flatten-maven-plugin
@@ -209,7 +222,7 @@
org.apache.maven.plugins
maven-source-plugin
- ${maven-source-plugin.version}
+ ${maven.source.plugin.version}
true
diff --git a/threadpool/core/src/test/java/brave/internal/WrappingExecutorService.java b/threadpool/core/src/test/java/brave/internal/WrappingExecutorService.java
new file mode 100644
index 0000000000..7e9ee3e175
--- /dev/null
+++ b/threadpool/core/src/test/java/brave/internal/WrappingExecutorService.java
@@ -0,0 +1,105 @@
+/*
+ * 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 brave.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+public abstract class WrappingExecutorService implements ExecutorService {
+
+ protected WrappingExecutorService() {
+ }
+
+ protected abstract ExecutorService delegate();
+
+ protected abstract Callable wrap(Callable var1);
+
+ protected abstract Runnable wrap(Runnable var1);
+
+ public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+ return this.delegate().awaitTermination(timeout, unit);
+ }
+
+ public List> invokeAll(Collection extends Callable> tasks) throws InterruptedException {
+ return this.delegate().invokeAll(this.wrap(tasks));
+ }
+
+ public List> invokeAll(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException {
+ return this.delegate().invokeAll(this.wrap(tasks), timeout, unit);
+ }
+
+ public T invokeAny(Collection extends Callable> tasks) throws InterruptedException, ExecutionException {
+ return this.delegate().invokeAny(this.wrap(tasks));
+ }
+
+ public T invokeAny(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
+ return this.delegate().invokeAny(this.wrap(tasks), timeout, unit);
+ }
+
+ public boolean isShutdown() {
+ return this.delegate().isShutdown();
+ }
+
+ public boolean isTerminated() {
+ return this.delegate().isTerminated();
+ }
+
+ public void shutdown() {
+ this.delegate().shutdown();
+ }
+
+ public List shutdownNow() {
+ return this.delegate().shutdownNow();
+ }
+
+ public void execute(Runnable task) {
+ this.delegate().execute(this.wrap(task));
+ }
+
+ public Future submit(Callable task) {
+ return this.delegate().submit(this.wrap(task));
+ }
+
+ public Future> submit(Runnable task) {
+ return this.delegate().submit(this.wrap(task));
+ }
+
+ public Future submit(Runnable task, T result) {
+ return this.delegate().submit(this.wrap(task), result);
+ }
+
+ Collection extends Callable> wrap(Collection extends Callable> tasks) {
+ ArrayList> result = new ArrayList(tasks.size());
+ Iterator var3 = tasks.iterator();
+
+ while (var3.hasNext()) {
+ Callable task = (Callable) var3.next();
+ result.add(this.wrap(task));
+ }
+
+ return result;
+ }
+}
diff --git a/threadpool/core/src/test/java/cn/hippo4j/core/CustomWrappingExecutorService.java b/threadpool/core/src/test/java/cn/hippo4j/core/CustomWrappingExecutorService.java
new file mode 100644
index 0000000000..ebc6a6226a
--- /dev/null
+++ b/threadpool/core/src/test/java/cn/hippo4j/core/CustomWrappingExecutorService.java
@@ -0,0 +1,50 @@
+/*
+ * 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 cn.hippo4j.core;
+
+import brave.internal.WrappingExecutorService;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+
+public class CustomWrappingExecutorService extends WrappingExecutorService {
+
+ ExecutorService delegate;
+
+ public CustomWrappingExecutorService() {
+ }
+
+ public CustomWrappingExecutorService(ExecutorService delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public ExecutorService delegate() {
+ return delegate;
+ }
+
+ @Override
+ protected Callable wrap(Callable callable) {
+ return callable;
+ }
+
+ @Override
+ protected Runnable wrap(Runnable runnable) {
+ return runnable;
+ }
+}
diff --git a/threadpool/core/src/test/java/cn/hippo4j/core/adapter/ZipkinExecutorAdapterTest.java b/threadpool/core/src/test/java/cn/hippo4j/core/adapter/ZipkinExecutorAdapterTest.java
new file mode 100644
index 0000000000..eb27eec4c9
--- /dev/null
+++ b/threadpool/core/src/test/java/cn/hippo4j/core/adapter/ZipkinExecutorAdapterTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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 cn.hippo4j.core.adapter;
+
+import cn.hippo4j.common.executor.support.RunsOldestTaskPolicy;
+import cn.hippo4j.common.handler.ZipkinExecutorAdapter;
+import cn.hippo4j.core.CustomWrappingExecutorService;
+import cn.hippo4j.core.executor.support.ThreadPoolBuilder;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.scheduling.concurrent.DefaultManagedAwareThreadFactory;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * test for ${@link ZipkinExecutorAdapter}
+ * */
+@Slf4j
+public class ZipkinExecutorAdapterTest {
+
+ ZipkinExecutorAdapter zipkinExecutorAdapter = new ZipkinExecutorAdapter();
+ Executor dynamicThreadPool = ThreadPoolBuilder.builder()
+ .threadPoolId("test")
+ .dynamicPool()
+ .corePoolSize(1)
+ .maximumPoolSize(2)
+ .keepAliveTime(1000)
+ .timeUnit(TimeUnit.MICROSECONDS)
+ .threadFactory(new DefaultManagedAwareThreadFactory())
+ .workQueue(new SynchronousQueue<>())
+ .rejected(new RunsOldestTaskPolicy())
+ .build();
+
+ @Test
+ public void testMatch() {
+ Object executor = new CustomWrappingExecutorService(Executors.newCachedThreadPool());
+ Assert.assertTrue(zipkinExecutorAdapter.match(executor));
+ }
+
+ @Test
+ public void testUnwrap() {
+ Object executor = new CustomWrappingExecutorService(Executors.newCachedThreadPool());
+ ThreadPoolExecutor unwrap = zipkinExecutorAdapter.unwrap(executor);
+ Assert.assertNull(unwrap);
+ }
+
+ @Test
+ public void testReplace() {
+ Object executor = new CustomWrappingExecutorService(Executors.newCachedThreadPool());
+ CustomWrappingExecutorService executorChange = (CustomWrappingExecutorService)executor;
+ ExecutorService beforeReplace = executorChange.delegate();
+ zipkinExecutorAdapter.replace(executor, dynamicThreadPool);
+ ExecutorService afterReplace = executorChange.delegate();
+
+ Assert.assertNotSame(beforeReplace, afterReplace);
+ Assert.assertSame(afterReplace, dynamicThreadPool);
+ }
+}
\ No newline at end of file