目录放置
-
jsp是 main目录下 放 webapp(指定为web访问的根目录)
- 跟目录下放置:WEB-INF
- 下面在放 jsp
-
静态文件放置在 resource (资源文件夹)的static 目录下
-
比如js文件夹,那引用就变成:
-
异步线程池
-
异步线程池
-
JMS消息
-
webSocket
-
定时
-
点击生成报表,而不需要立马就查看到报表
-
查看报表,是业务人员看的。
定义线程 和 开启异步可用
- 配置异步线程池的接口
public interface AsyncConfigurer {
//返回一个自定义的线程池,提供空闲的线程来执行异步任务
@Nullable
default Executor getAsyncExecutor() {
return null;
}
//处理异常的处理器
@Nullable
default AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
- @EnableAsync,开启异步可用。可使用 @Async
异步实例
配置
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
// 定义线程池
@Override
public Executor getAsyncExecutor() {
// 定义线程池
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 核心线程数
taskExecutor.setCorePoolSize(10);
// 线程池最大线程数
taskExecutor.setMaxPoolSize(30);
// 线程队列最大线程数
taskExecutor.setQueueCapacity(2000);
// 初始化
taskExecutor.initialize();
return taskExecutor;
}
}
使用
@Controller
@RequestMapping("/async")
public class AsyncController {
// 注入异步服务接口
@Autowired
private AsyncService asyncService = null;
@GetMapping("/page")
public String asyncPage() {
System.out.println("请求线程名称:" + "【" + Thread.currentThread().getName() + "】");
// 调用异步服务
asyncService.generateReport();
return "async";
}
}
public interface AsyncService {
public void generateReport();
}
@Service
public class AsyncServiceImpl implements AsyncService {
@Override
@Async // 声明使用异步调用
public void generateReport() {
// 打印异步线程名称
System.out.println("报表线程名称:"
+ "【" + Thread.currentThread().getName() +"】");
}
}
线程不定,哈哈哈
请求线程名称:【http-nio-8080-exec-1】
报表线程名称:【ThreadPoolTaskExecutor-1】
请求线程名称:【http-nio-8080-exec-2】
报表线程名称:【ThreadPoolTaskExecutor-2】
请求线程名称:【http-nio-8080-exec-6】
报表线程名称:【ThreadPoolTaskExecutor-3】
请求线程名称:【http-nio-8080-exec-1】
报表线程名称:【ThreadPoolTaskExecutor-5】