Код выглядит следующим образом:
package com.kaigejava.dataanalysis; import lombok.Data; import lombok.extern.slf4j.Slf4j; @Data @Slf4j public class ThreadShareDataDTO { /** * Есть ли у вас разрешение на просмотр данных? * Используется для решения: SaToken,не-веб-контекст не может получить проблему с запросом. */ private Boolean hasDataViewRole; //Предотвращаем создание нового и генерируем одноэлементный класс private ThreadShareDataDTO(){} /** * ThreadLocal:Привязать переменные к текущему потоку,ЭквивалентноMap<Thread, value> * Здесь используется структура шаблона Баохан. */ private static ThreadLocal<ThreadShareDataDTO> threadLocal = new ThreadLocal<>(); /** * Возвращает синглтон текущего потока * Здесь нет необходимости использовать ключевое слово «синхронизировано». Подумайте, почему? */ public static ThreadShareDataDTO getCurrentThreadInstance() { ThreadShareDataDTO shareData = threadLocal.get(); if (shareData == null) { shareData = new ThreadShareDataDTO(); threadLocal.set(shareData); } return shareData; } public static void clear(){ log.info("Начать удаление данных в threadLocal"); threadLocal.remove(); } }
public void startCreateDataReport(TenantMonitorReportListRequest param) { boolean hasDataViewRole = StpUtil.hasRole(dataViewRole); param.setHasDataViewRole(hasDataViewRole); new MakeReportThread(param).start(); }
boolean hasDataViewRole ; ThreadShareDataDTO shardData = ThreadShareDataDTO.getCurrentThreadInstance(); if (Objects.nonNull(shardData.getHasDataViewRole())) { hasDataViewRole = shardData.getHasDataViewRole(); } else { hasDataViewRole = StpUtil.hasRole(dataViewRole); }
проиллюстрировать:
Сначала получите общую переменную из threadLocal, если она существует, получите ее напрямую. Если он не существует, вызовите исходный метод.
После завершения выполнения потока удалите методfinally:
} окончательно { //Удалить из потокаLocal ThreadShareDataDTO.clear(); }