From ead450d04edfe8ace486ea6456548e05a283f162 Mon Sep 17 00:00:00 2001 From: wyl <959814898@qq.com> Date: Sun, 7 Aug 2022 22:34:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0ttl=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- concurrent/pom.xml | 9 ++ .../concurrent/ttl/context/ContextUtil.java | 29 ++++ .../concurrent/ttl/task/CallableTask.java | 23 +++ .../concurrent/ttl/task/RunnableTask.java | 26 ++++ .../ttl/TransmittableThreadLocalTest.java | 139 ++++++++++++++++++ pom.xml | 8 + spring-boot/pom.xml | 1 + spring-boot/spring-boot-common/pom.xml | 4 - .../boot/common/spel/SpelTestAspect.java | 3 - 9 files changed, 235 insertions(+), 7 deletions(-) create mode 100644 concurrent/src/main/java/concurrent/ttl/context/ContextUtil.java create mode 100644 concurrent/src/main/java/concurrent/ttl/task/CallableTask.java create mode 100644 concurrent/src/main/java/concurrent/ttl/task/RunnableTask.java create mode 100644 concurrent/src/test/java/concurrent/ttl/TransmittableThreadLocalTest.java diff --git a/concurrent/pom.xml b/concurrent/pom.xml index a829cdc..1684c33 100644 --- a/concurrent/pom.xml +++ b/concurrent/pom.xml @@ -23,6 +23,15 @@ 5.8.2 test + + com.alibaba + transmittable-thread-local + 2.13.2 + + + cn.hutool + hutool-core + \ No newline at end of file diff --git a/concurrent/src/main/java/concurrent/ttl/context/ContextUtil.java b/concurrent/src/main/java/concurrent/ttl/context/ContextUtil.java new file mode 100644 index 0000000..8ec2280 --- /dev/null +++ b/concurrent/src/main/java/concurrent/ttl/context/ContextUtil.java @@ -0,0 +1,29 @@ +package concurrent.ttl.context; + +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * @author: wangyl + * @date: 2022/8/7 + * @description: 上线文存储 + */ +public class ContextUtil { + static TransmittableThreadLocal transmittableThreadLocal = new TransmittableThreadLocal<>(); + static ThreadLocal threadLocal = new ThreadLocal<>(); + + public static String getTransmittableThreadLocal() { + return transmittableThreadLocal.get(); + } + + public static void setTransmittableThreadLocal(String value) { + transmittableThreadLocal.set(value); + } + + public static String getThreadLocal() { + return threadLocal.get(); + } + + public static void setThreadLocal(String value) { + threadLocal.set(value); + } +} diff --git a/concurrent/src/main/java/concurrent/ttl/task/CallableTask.java b/concurrent/src/main/java/concurrent/ttl/task/CallableTask.java new file mode 100644 index 0000000..68e3dc3 --- /dev/null +++ b/concurrent/src/main/java/concurrent/ttl/task/CallableTask.java @@ -0,0 +1,23 @@ +package concurrent.ttl.task; + +import concurrent.ttl.context.ContextUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Callable; + +@Slf4j +public class CallableTask implements Callable { + + /** + * Computes a result, or throws an exception if unable to do so. + * + * @return computed result + * @throws Exception if unable to compute a result + */ + @Override + public String call() throws Exception { + log.info("ThreadLocal 的值为{}", ContextUtil.getThreadLocal()); + log.info("TransmittableThreadLocal 的值为{}", ContextUtil.getTransmittableThreadLocal()); + return "null"; + } +} diff --git a/concurrent/src/main/java/concurrent/ttl/task/RunnableTask.java b/concurrent/src/main/java/concurrent/ttl/task/RunnableTask.java new file mode 100644 index 0000000..bddec49 --- /dev/null +++ b/concurrent/src/main/java/concurrent/ttl/task/RunnableTask.java @@ -0,0 +1,26 @@ +package concurrent.ttl.task; + +import concurrent.ttl.context.ContextUtil; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RunnableTask implements Runnable { + + /** + * When an object implementing interface Runnable is used + * to create a thread, starting the thread causes the object's + * run method to be called in that separately executing + * thread. + *

+ * The general contract of the method run is that it may + * take any action whatsoever. + * + * @see Thread#run() + */ + @Override + public void run() { + log.info("ThreadLocal 的值为{}", ContextUtil.getThreadLocal()); + log.info("TransmittableThreadLocal 的值为{}", ContextUtil.getTransmittableThreadLocal()); + } +} + diff --git a/concurrent/src/test/java/concurrent/ttl/TransmittableThreadLocalTest.java b/concurrent/src/test/java/concurrent/ttl/TransmittableThreadLocalTest.java new file mode 100644 index 0000000..e6c297a --- /dev/null +++ b/concurrent/src/test/java/concurrent/ttl/TransmittableThreadLocalTest.java @@ -0,0 +1,139 @@ +package concurrent.ttl; + +import cn.hutool.core.thread.ThreadUtil; +import com.alibaba.ttl.TtlCallable; +import com.alibaba.ttl.TtlRunnable; +import concurrent.ttl.context.ContextUtil; +import concurrent.ttl.task.CallableTask; +import concurrent.ttl.task.RunnableTask; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicInteger; + + +@Slf4j +public class TransmittableThreadLocalTest { + + static ExecutorService executorService; + static AtomicInteger atomicInteger; + + @BeforeAll + public static void before() { + ContextUtil.setThreadLocal("wyl-01"); + ContextUtil.setTransmittableThreadLocal("wyl-02"); + executorService = ThreadUtil.newExecutor(3); + atomicInteger = new AtomicInteger(0); + } + + /** + * 不修改值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void runnableTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + RunnableTask runnableTask = new RunnableTask(); + executorService.execute(runnableTask); + } + Thread.sleep(10000L); + } + + /** + * 修改值 线程池里值用的旧值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void runnableChangeErrorTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + RunnableTask runnableTask = new RunnableTask(); + ContextUtil.setTransmittableThreadLocal("wyl-02-" + atomicInteger.incrementAndGet()); + executorService.execute(runnableTask); + } + Thread.sleep(10000L); + } + + /** + * 修改值线程池用的新值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void runnableChangeRightTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + RunnableTask runnableTask = new RunnableTask(); + ContextUtil.setTransmittableThreadLocal("wyl-02-" + atomicInteger.incrementAndGet()); + TtlRunnable ttlRunnable = TtlRunnable.get(runnableTask); + executorService.execute(ttlRunnable); + } + Thread.sleep(10000L); + } + + /** + * 不修改值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void callableTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + CallableTask runnableTask = new CallableTask(); + executorService.submit(runnableTask); + } + Thread.sleep(10000L); + } + + /** + * 修改值线程池用的旧值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void callableChangeErrorTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + CallableTask runnableTask = new CallableTask(); + ContextUtil.setTransmittableThreadLocal("wyl-02-" + atomicInteger.incrementAndGet()); + executorService.submit(runnableTask); + } + Thread.sleep(10000L); + } + + /** + * 修改值线程池里用的新值 + * + * @param + * @return void + * @Date 2022/8/7 + * @Author wangyl + */ + @Test + public void callableChangeRightTest() throws InterruptedException { + for (int i = 0; i < 1000; i++) { + CallableTask runnableTask = new CallableTask(); + ContextUtil.setTransmittableThreadLocal("wyl-02-" + atomicInteger.incrementAndGet()); + TtlCallable stringTtlCallable = TtlCallable.get(runnableTask); + executorService.submit(stringTtlCallable); + } + Thread.sleep(10000L); + } + +} diff --git a/pom.xml b/pom.xml index 2bc3750..e85aab5 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,14 @@ xxl-job-core 2.3.0 + + cn.hutool + hutool-bom + 5.8.5 + pom + + import + diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 435758f..16b2cd1 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -13,6 +13,7 @@ spring-boot-xxjob spring-boot-common spring-boot-rabbitmq + spring-boot-mybatis spring-boot diff --git a/spring-boot/spring-boot-common/pom.xml b/spring-boot/spring-boot-common/pom.xml index 544849f..91cfc1e 100644 --- a/spring-boot/spring-boot-common/pom.xml +++ b/spring-boot/spring-boot-common/pom.xml @@ -21,10 +21,6 @@ org.springframework.boot spring-boot-starter - - - - org.springframework.boot spring-boot-starter-aop diff --git a/spring-boot/spring-boot-common/src/main/java/com/wyl/spring/boot/common/spel/SpelTestAspect.java b/spring-boot/spring-boot-common/src/main/java/com/wyl/spring/boot/common/spel/SpelTestAspect.java index 04c318d..d6e399f 100644 --- a/spring-boot/spring-boot-common/src/main/java/com/wyl/spring/boot/common/spel/SpelTestAspect.java +++ b/spring-boot/spring-boot-common/src/main/java/com/wyl/spring/boot/common/spel/SpelTestAspect.java @@ -1,18 +1,15 @@ package com.wyl.spring.boot.common.spel; -import com.fasterxml.jackson.databind.ObjectMapper; import com.wyl.spring.boot.common.spel.annotation.SpelTest; import com.wyl.spring.boot.common.spel.service.EvaluationContext; import com.wyl.spring.boot.common.spel.service.Evaluator; import com.wyl.spring.boot.common.spel.service.RootObject; import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.aop.framework.AopProxyUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.lang.reflect.Method;