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> tasks) throws InterruptedException { + return this.delegate().invokeAll(this.wrap(tasks)); + } + + public List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { + return this.delegate().invokeAll(this.wrap(tasks), timeout, unit); + } + + public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { + return this.delegate().invokeAny(this.wrap(tasks)); + } + + public T invokeAny(Collection> 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> wrap(Collection> 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