From caae7f60a1973ce20ba25aa93f1ea7523908860a Mon Sep 17 00:00:00 2001 From: wangxianzhang Date: Tue, 8 Mar 2022 21:20:52 +0800 Subject: [PATCH] =?UTF-8?q?ttl=E6=94=B9=E9=80=A0=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E5=BE=85=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epmet-commons/epmet-commons-tools/pom.xml | 5 + .../commons/tools/config/AsyncConfig.java | 3 +- .../tools/constant/ThreadLocalConstant.java | 4 - .../feign/EpmetBaseRequestInterceptor.java | 19 ++-- .../FeignHystrixConcurrencyStrategy.java | 104 +++++++++++++++--- .../commons/tools/filter/GlobalFilter.java | 53 ++++++++- .../tools/utils/EpmetRequestHolder.java | 67 +++++++++++ .../controller/IcResiUserController.java | 57 ++++------ .../service/IcResiUserImportService.java | 2 + .../impl/IcResiUserImportServiceImpl.java | 57 ++++++---- 10 files changed, 278 insertions(+), 93 deletions(-) create mode 100644 epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java diff --git a/epmet-commons/epmet-commons-tools/pom.xml b/epmet-commons/epmet-commons-tools/pom.xml index 31e2276fc4..cafd5f7023 100644 --- a/epmet-commons/epmet-commons-tools/pom.xml +++ b/epmet-commons/epmet-commons-tools/pom.xml @@ -161,6 +161,11 @@ 2.6.0 compile + + com.alibaba + transmittable-thread-local + 2.12.4 + diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/config/AsyncConfig.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/config/AsyncConfig.java index 2778f3c9ef..f094348322 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/config/AsyncConfig.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/config/AsyncConfig.java @@ -1,5 +1,6 @@ package com.epmet.commons.tools.config; +import com.alibaba.ttl.threadpool.TtlExecutors; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -69,7 +70,7 @@ public class AsyncConfig { @Bean public ExecutorService executorService() { ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); - return executor.getThreadPoolExecutor(); + return TtlExecutors.getTtlExecutorService(executor.getThreadPoolExecutor()); } /** diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ThreadLocalConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ThreadLocalConstant.java index 9061c2e8d3..40d69ebcf4 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ThreadLocalConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/ThreadLocalConstant.java @@ -22,8 +22,4 @@ public class ThreadLocalConstant { */ public static final ThreadLocal requestParam = new ThreadLocal(); - /** - * 可被子线程继承的,追加的request headers - */ - public static final InheritableThreadLocal> inheritableAdditionalHeaders = new InheritableThreadLocal<>(); } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java index d19a1145d2..2cfa8ea3ad 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/EpmetBaseRequestInterceptor.java @@ -1,6 +1,6 @@ package com.epmet.commons.tools.feign; -import com.epmet.commons.tools.constant.ThreadLocalConstant; +import com.epmet.commons.tools.utils.EpmetRequestHolder; import feign.RequestInterceptor; import feign.RequestTemplate; import org.slf4j.Logger; @@ -21,23 +21,17 @@ public class EpmetBaseRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { - // 自定义追加的request header,可被子线程继承拷贝 - Map inheritableAdditionalHeaders = FeignHystrixConcurrencyStrategy.hystrixAdditionHeaders.get(); - Map requestHeaders = getHeadersFromRequest(); + Map requestHeaders = EpmetRequestHolder.getAllHeaders(); - log.info("EpmetBaseRequestInterceptor#apply#inheritableAdditionalHeaders:"+inheritableAdditionalHeaders); +// Map requestHeaders = getHeadersFromRequest(); + + log.info("EpmetBaseRequestInterceptor#apply#inheritableAdditionalHeaders:" + requestHeaders); if (requestHeaders != null && requestHeaders.size() > 0) { for (Map.Entry kv : requestHeaders.entrySet()) { template.header(kv.getKey(), kv.getValue()); } } - - if (inheritableAdditionalHeaders != null && inheritableAdditionalHeaders.size() > 0) { - for (Map.Entry kv : inheritableAdditionalHeaders.entrySet()) { - template.header(kv.getKey(), kv.getValue()); - } - } } /** @@ -47,6 +41,9 @@ public class EpmetBaseRequestInterceptor implements RequestInterceptor { HashMap headers = new HashMap<>(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return null; + } HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); Enumeration headerNames = request.getHeaderNames(); if (headerNames != null) { diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignHystrixConcurrencyStrategy.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignHystrixConcurrencyStrategy.java index 0d2998ccd3..2a63841ac9 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignHystrixConcurrencyStrategy.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/feign/FeignHystrixConcurrencyStrategy.java @@ -1,6 +1,6 @@ package com.epmet.commons.tools.feign; -import com.epmet.commons.tools.constant.ThreadLocalConstant; +import com.alibaba.ttl.TtlRunnable; import com.netflix.hystrix.HystrixThreadPoolKey; import com.netflix.hystrix.HystrixThreadPoolProperties; import com.netflix.hystrix.strategy.HystrixPlugins; @@ -12,17 +12,15 @@ import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook; import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher; import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy; import com.netflix.hystrix.strategy.properties.HystrixProperty; +import com.netflix.hystrix.util.PlatformSpecific; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Callable; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; /** * 自定义Feign的隔离策略 @@ -37,7 +35,6 @@ import java.util.concurrent.TimeUnit; @Component public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy { - public static final ThreadLocal> hystrixAdditionHeaders = new ThreadLocal<>(); private static final Logger log = LoggerFactory.getLogger(FeignHystrixConcurrencyStrategy.class); private HystrixConcurrencyStrategy delegate; @@ -77,23 +74,57 @@ public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy @Override public Callable wrapCallable(Callable callable) { - Map inheritableAdditionalHeaders = ThreadLocalConstant.inheritableAdditionalHeaders.get(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - return new WrappedCallable<>(callable, requestAttributes, inheritableAdditionalHeaders); + return new WrappedCallable<>(callable, requestAttributes); } @Override public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixProperty corePoolSize, HystrixProperty maximumPoolSize, HystrixProperty keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { - return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, keepAliveTime, - unit, workQueue); +// return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); + + final ThreadFactory threadFactory = getThreadFactory(threadPoolKey); + + final int dynamicCoreSize = corePoolSize.get(); + final int dynamicMaximumSize = maximumPoolSize.get(); + + if (dynamicCoreSize > dynamicMaximumSize) { + log.error("Epmet Hystrix ThreadPool configuration at startup for : " + threadPoolKey.name() + " is trying to set coreSize = " + + dynamicCoreSize + " and maximumSize = " + dynamicMaximumSize + ". Maximum size will be set to " + + dynamicCoreSize + ", the coreSize value, since it must be equal to or greater than the coreSize value"); + return new WrappedThreadPoolExecutor(dynamicCoreSize, dynamicCoreSize, keepAliveTime.get(), unit, workQueue, threadFactory); + } else { + return new WrappedThreadPoolExecutor(dynamicCoreSize, dynamicMaximumSize, keepAliveTime.get(), unit, workQueue, threadFactory); + } } @Override public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolProperties threadPoolProperties) { - return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties); +// return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties); + + final ThreadFactory threadFactory = getThreadFactory(threadPoolKey); + + final boolean allowMaximumSizeToDivergeFromCoreSize = threadPoolProperties.getAllowMaximumSizeToDivergeFromCoreSize().get(); + final int dynamicCoreSize = threadPoolProperties.coreSize().get(); + final int keepAliveTime = threadPoolProperties.keepAliveTimeMinutes().get(); + final int maxQueueSize = threadPoolProperties.maxQueueSize().get(); + final BlockingQueue workQueue = getBlockingQueue(maxQueueSize); + + if (allowMaximumSizeToDivergeFromCoreSize) { + final int dynamicMaximumSize = threadPoolProperties.maximumSize().get(); + if (dynamicCoreSize > dynamicMaximumSize) { + log.error("Epmet Hystrix ThreadPool configuration at startup for : " + threadPoolKey.name() + " is trying to set coreSize = " + + dynamicCoreSize + " and maximumSize = " + dynamicMaximumSize + ". Maximum size will be set to " + + dynamicCoreSize + ", the coreSize value, since it must be equal to or greater than the coreSize value"); + return new WrappedThreadPoolExecutor(dynamicCoreSize, dynamicCoreSize, keepAliveTime, TimeUnit.MINUTES, workQueue, threadFactory); + } else { + return new WrappedThreadPoolExecutor(dynamicCoreSize, dynamicMaximumSize, keepAliveTime, TimeUnit.MINUTES, workQueue, threadFactory); + } + } else { + return new WrappedThreadPoolExecutor(dynamicCoreSize, dynamicCoreSize, keepAliveTime, TimeUnit.MINUTES, workQueue, threadFactory); + } } @Override @@ -106,21 +137,41 @@ public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy return this.delegate.getRequestVariable(rv); } + /** + * 从父类复制过来的 + * @param threadPoolKey + * @return + */ + private ThreadFactory getThreadFactory(final HystrixThreadPoolKey threadPoolKey) { + if (!PlatformSpecific.isAppEngineStandardEnvironment()) { + return new ThreadFactory() { + private final AtomicInteger threadNumber = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r, "hystrix-" + threadPoolKey.name() + "-" + threadNumber.incrementAndGet()); + thread.setDaemon(true); + return thread; + } + + }; + } else { + return PlatformSpecific.getAppEngineThreadFactory(); + } + } + static class WrappedCallable implements Callable { private final Callable target; private final RequestAttributes requestAttributes; - private final Map inheritableAdditionalHeaders; - public WrappedCallable(Callable target, RequestAttributes requestAttributes, Map inheritableAdditionalHeaders) { + public WrappedCallable(Callable target, RequestAttributes requestAttributes) { this.target = target; this.requestAttributes = requestAttributes; - this.inheritableAdditionalHeaders = inheritableAdditionalHeaders; } @Override public T call() throws Exception { try { - hystrixAdditionHeaders.set(inheritableAdditionalHeaders); RequestContextHolder.setRequestAttributes(requestAttributes); return target.call(); } finally { @@ -128,4 +179,25 @@ public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy } } } + + /** + * 自定义线程池类,使用Ttl包装过,解决异步环境下线程上下文透传问题 + */ + static class WrappedThreadPoolExecutor extends ThreadPoolExecutor { + private static final RejectedExecutionHandler defaultHandler = new AbortPolicy(); + + public WrappedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + BlockingQueue workQueue) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); + } + public WrappedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + BlockingQueue workQueue, ThreadFactory threadFactory) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler); + } + + @Override + public void execute(Runnable command) { + super.execute(TtlRunnable.get(command)); + } + } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/filter/GlobalFilter.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/filter/GlobalFilter.java index 4aa7beab20..d27a5dbe0f 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/filter/GlobalFilter.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/filter/GlobalFilter.java @@ -1,10 +1,16 @@ package com.epmet.commons.tools.filter; import com.epmet.commons.tools.constant.ThreadLocalConstant; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.utils.EpmetRequestHolder; +import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.Enumeration; +import java.util.HashMap; /** * @Description 全局过滤器,可在请求结束的时候清除线程变量残留 @@ -12,20 +18,59 @@ import java.io.IOException; * @date 2021.07.19 10:19:24 */ @WebFilter(value = "/*") +@Slf4j public class GlobalFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { try { + // 获取request中的header,放入RequestHeaderHolder,用于异步环境下的上下文透传 + HashMap headerMap = getHeadersFromRequest((HttpServletRequest) servletRequest); + EpmetRequestHolder.addHeaders(headerMap); + filterChain.doFilter(servletRequest, servletResponse); } catch (Throwable e) { throw e; } finally { // 清除线程变量残留 - ThreadLocalConstant.sqlFilter.remove(); - ThreadLocalConstant.requirePermissionTl.remove(); - ThreadLocalConstant.requestParam.remove(); - ThreadLocalConstant.inheritableAdditionalHeaders.remove(); + clear(ThreadLocalConstant.sqlFilter, "sqlFilter"); + clear(ThreadLocalConstant.requirePermissionTl, "requirePermissionTl"); + clear(ThreadLocalConstant.requestParam, "requestParam"); + EpmetRequestHolder.clearAllHeaders(); + System.out.println("清理完成"); + } + } + + /** + * 从header里面获取headers + */ + public HashMap getHeadersFromRequest(HttpServletRequest request) { + HashMap headers = new HashMap<>(); + Enumeration headerNames = request.getHeaderNames(); + if (headerNames != null) { + while (headerNames.hasMoreElements()) { + String name = headerNames.nextElement(); + Enumeration values = request.getHeaders(name); + while (values.hasMoreElements()) { + String value = values.nextElement(); + headers.put(name, value); + } + } + } + return headers; + } + + /** + * 清空threadlocal + * @param tl + * @param tag + */ + public void clear(ThreadLocal tl, String tag) { + try { + tl.remove(); + } catch (Throwable t) { + String errorMsg = ExceptionUtils.getThrowableErrorStackTrace(t); + log.error("【GlobalFilter】清空ThreadLocal失败,{}, {}", tag, errorMsg); } } } \ No newline at end of file diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java new file mode 100644 index 0000000000..80849ebfc3 --- /dev/null +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/EpmetRequestHolder.java @@ -0,0 +1,67 @@ +package com.epmet.commons.tools.utils; + +import com.alibaba.ttl.TransmittableThreadLocal; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 请求header holder,可用于异步环境下request header的透传。详情结合 alibaba transmitable-thread-local + */ +public class EpmetRequestHolder { + + public static final TransmittableThreadLocal> requestHeaderTtl = new TransmittableThreadLocal<>(); + + /** + * 存储 + * @param headerName + * @param headerValue + */ + public static void addHeader(String headerName, String headerValue) { + if (StringUtils.isBlank(headerName)) { + return; + } + before(); + requestHeaderTtl.get().put(headerName, headerValue); + } + + public static void addHeaders(Map headers) { + if (headers == null) { + return; + } + before(); + requestHeaderTtl.get().putAll(headers); + } + + private static void before() { + if (requestHeaderTtl.get() == null) { + requestHeaderTtl.set(new HashMap<>()); + } + } + + /** + * 获取 + * @param headerName + * @return + */ + public static String getHeader(String headerName) { + return requestHeaderTtl.get().get(headerName); + } + + /** + * 获取所有 + * @return + */ + public static Map getAllHeaders() { + return requestHeaderTtl.get(); + } + + /** + * 清空内容 + */ + public static void clearAllHeaders() { + requestHeaderTtl.remove(); + } + +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index e09f7427c5..bde8165171 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -35,7 +35,6 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; -import com.epmet.commons.tools.feign.EpmetBaseRequestInterceptor; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.redis.RedisKeys; @@ -43,10 +42,7 @@ import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.security.user.LoginUserUtil; -import com.epmet.commons.tools.utils.ExcelUtils; -import com.epmet.commons.tools.utils.HttpClientManager; -import com.epmet.commons.tools.utils.IpUtils; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.*; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.constant.SystemMessageType; import com.epmet.constants.ImportTaskConstants; @@ -67,7 +63,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.tomcat.util.http.MimeHeaders; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; @@ -75,7 +70,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -83,13 +77,11 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Field; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; @@ -135,6 +127,8 @@ public class IcResiUserController implements ResultDataResolver { private LoginUserUtil loginUserUtil; @Autowired private RequestInterceptor requestInterceptor; + @Autowired + private ExecutorService executorService; /** * 模板枚举 @@ -467,12 +461,8 @@ public class IcResiUserController implements ResultDataResolver { throw new RenException("上传失败"); } - HashMap headers = ((EpmetBaseRequestInterceptor) requestInterceptor).getHeadersFromRequest(); - - ThreadLocalConstant.inheritableAdditionalHeaders.set(headers); - // 三.异步执行导入 - new Thread(() -> { + executorService.execute(() -> { try { List formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode()); @@ -491,31 +481,12 @@ public class IcResiUserController implements ResultDataResolver { } catch (IOException e) { log.error("【导入居民信息失败】清理上传的文件失败:{}", ExceptionUtils.getErrorStackTrace(e)); } - - // 清理tl对象 - ThreadLocalConstant.inheritableAdditionalHeaders.remove(); } - }).start(); + }); return new Result(); } -// private HashMap getHeadersFromRequest(HttpServletRequest request) { -// HashMap headers = new HashMap<>(); -// Enumeration headerNames = request.getHeaderNames(); -// if (headerNames != null) { -// while (headerNames.hasMoreElements()) { -// String name = headerNames.nextElement(); -// Enumeration values = request.getHeaders(name); -// while (values.hasMoreElements()) { -// String value = values.nextElement(); -// headers.put(name, value); -// } -// } -// } -// return headers; -// } - @PostMapping("test") public Result>> test(@LoginUser TokenDto tokenDto, @RequestBody DynamicQueryFormDTO formDTO) { formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); @@ -747,4 +718,22 @@ public class IcResiUserController implements ResultDataResolver { ValidatorUtils.validateEntity(formDTO, PersonWarnRightListFormDTO.PersonWarnRightListForm.class); return new Result().ok(icResiUserService.personWarnRightList(formDTO,tokenDto)); } + +// public static ThreadLocal tl = new ThreadLocal(); + + @PostMapping("test-async") + public Result testAsync(HttpServletRequest request){ +// tl.set("wxz"); + executorService.submit(() -> { + try { + Thread.sleep(500l); + System.out.println("["+Thread.currentThread().getId() + "]:" + EpmetRequestHolder.getHeader("app")); + System.out.println("---"); + } catch (InterruptedException e) { + e.printStackTrace(); + } +// icResiUserImportService.testAsync(); + }); + return new Result(); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java index 7358dcd961..05fb431c32 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java @@ -32,4 +32,6 @@ public interface IcResiUserImportService { * @param resultDescPath 结果描述文件,excel等文件,有错误的话需要传入,成功则不需要 */ void finishImportTask(String importTaskId, String operatorId, String processStatus, String resultDesc, String resultDescPath); + + Object testAsync(); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java index 62b7dbf697..302d3d7b01 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java @@ -24,7 +24,9 @@ import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; +import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.EpmetRequestHolder; import com.epmet.commons.tools.utils.Result; import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.IcResiUserDao; @@ -213,9 +215,9 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res @Override public void importIcResiInfoFromExcel(String importTaskId, List formItemList, String excelPathName, HttpServletResponse response, Path importTempPath) { - String app = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.APP); - String client = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CLIENT); - String loginUserId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); + String app = EpmetRequestHolder.getHeader(AppClientConstant.APP); + String client = EpmetRequestHolder.getHeader(AppClientConstant.CLIENT); + String loginUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); String currUserAgencyId = userService.getLoginUserDetails(app, client, loginUserId).getAgencyId(); @@ -316,7 +318,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res */ private void initImportThreadLocal(String customerId) { // 生成importTag,用于标记唯一一次导入操作,导入完成之后,用来删除redis里面临时的key - String operatorId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); + String operatorId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); String importTag = operatorId + System.currentTimeMillis(); // 错误信息 @@ -356,10 +358,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res private void importIcResiBaseInfoFromExcel(List formItemList, String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId, String tableName, String customerId) { - String loginUserApp = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.APP); - String loginUserClient = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CLIENT); - String loginUserId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); - String loginUserCustomerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); + String loginUserApp = EpmetRequestHolder.getHeader(AppClientConstant.APP); + String loginUserClient = EpmetRequestHolder.getHeader(AppClientConstant.CLIENT); + String loginUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String loginUserCustomerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); log.info("importIcResiBaseInfoFromExcel:: userId:{}, app:{}, client:{}, customerId:{}", loginUserId, loginUserApp, loginUserClient, loginUserCustomerId); @@ -472,7 +474,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res columnAndValues.put("AGENCY_ID", currUserAgencyId); columnAndValues.put("PIDS", currUserAgencyPids); - columnAndValues.put("CUSTOMER_ID", ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase())); + columnAndValues.put("CUSTOMER_ID", EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase())); columnAndValues.put("UPDATED_BY", currentUserId); @@ -542,10 +544,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res LinkedHashMap columnAndValues = new LinkedHashMap<>(); - String loginUserApp = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.APP); - String loginUserClient = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CLIENT); - String loginUserId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); - String loginUserCustomerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); + String loginUserApp = EpmetRequestHolder.getHeader(AppClientConstant.APP); + String loginUserClient = EpmetRequestHolder.getHeader(AppClientConstant.CLIENT); + String loginUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String loginUserCustomerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); log.info("persistIcResiExtraInfo:: userId:{}, app:{}, client:{}, customerId:{}", loginUserId, loginUserApp, loginUserClient, loginUserCustomerId); @@ -1281,8 +1283,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Date now = new Date(); - String customerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); - String userId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); + String userId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String customerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); CustomerStaffInfoCacheResult operator = CustomerStaffRedis.getStaffInfo(customerId, userId); @@ -1378,8 +1380,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res Set newResiKeys = redisUtils.keys(RedisKeys.icResiImportTypeKey(newlyOrChangedResi.get().getImportTag(), "add").concat("*")); - String customerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); - String userId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); + String userId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String customerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); CustomerStaffInfoCacheResult operator = CustomerStaffRedis.getStaffInfo(customerId, userId); @@ -1416,8 +1418,10 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res */ public void saveTransferedResiRecord(Map transferedResis) { Date now = new Date(); - String loginUserId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); - String loginUserCustomerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); + + String loginUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String loginUserCustomerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); + CustomerStaffInfoCacheResult operator = CustomerStaffRedis.getStaffInfo(loginUserCustomerId, loginUserId); for (Map.Entry resi : transferedResis.entrySet()) { @@ -1831,11 +1835,18 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res } public void printLog(String positionPrefix) { - String app = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.APP); - String client = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CLIENT); - String loginUserId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.USER_ID.toLowerCase()); - String loginUserCustomerId = ThreadLocalConstant.inheritableAdditionalHeaders.get().get(AppClientConstant.CUSTOMER_ID.toLowerCase()); + String app = EpmetRequestHolder.getHeader(AppClientConstant.APP); + String client = EpmetRequestHolder.getHeader(AppClientConstant.CLIENT); + String loginUserId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID.toLowerCase()); + String loginUserCustomerId = EpmetRequestHolder.getHeader(AppClientConstant.CUSTOMER_ID.toLowerCase()); log.info("{}:: userId:{}, app:{}, client:{}, customerId:{}", positionPrefix, loginUserId, app, client, loginUserCustomerId); } + + @Override + public Object testAsync() { + IcNeighborHoodDTO nform = new IcNeighborHoodDTO(); + govOrgOpenFeignClient.getNeighborHoodOptions(nform); + return null; + } }