package com.tansuo365.test1.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Override
public Executor getAsyncExecutor() {
final ShiroSubjectAwareTaskExecutor executor = new ShiroSubjectAwareTaskExecutor();
executor.setBeanName("async-executor");
executor.setCorePoolSize(10);
executor.setMaxPoolSize(10);
executor.initialize();
executor.setAllowCoreThreadTimeOut(true);//允许核心线程空闲时,过了一定的时间自动销毁
executor.setKeepAliveSeconds(60);//设置线程空闲时间为1秒 1秒后便销毁
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
实体类上增加同步注解 @Async
@Async
@Getter @Setter @Accessors(chain = true)
@TableName("purchase_require")
public class PurchaseRequire
shiro官方提供的解决方法 super.execute(currentSubject.associateWith(task));
import org.apache.shiro.subject.Subject;
import org.apache.shiro.subject.support.SubjectRunnable;
import org.apache.shiro.util.ThreadContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Objects;
/**
* Created by on 2023/7/12.
*/
public class ShiroSubjectAwareTaskExecutor extends ThreadPoolTaskExecutor {
@Override
public boolean prefersShortLivedTasks() {
return false;
}
@Override
public void execute(Runnable task) {
if (task instanceof SubjectRunnable) {
super.execute(task);
return;
}
// not SubjectRunnable and currentSubject not null
Subject currentSubject = ThreadContext.getSubject();
if (Objects.nonNull(currentSubject)) {
super.execute(currentSubject.associateWith(task));
} else {
super.execute(task);
}
}
}
启动类增加注解@EnableAsync
@Slf4j
@SpringBootApplication
@EnableAsync
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}