方式二:使用很简单,直接返回的参数包裹一层callable即可,可以继承WebMvcConfigurerAdapter类来设置默认线程池和超时处理 。@RequestMapping(value =https://www.isolves.com/it/cxkf/kj/2020-12-11/ "/email/callableReq", method = GET) @ResponseBody public Callable
方式三:和方式二差不多,在Callable外包一层,给WebAsyncTask设置一个超时回调,即可实现超时处理 。@RequestMapping(value =https://www.isolves.com/it/cxkf/kj/2020-12-11/ "/email/webAsyncReq", method = GET) @ResponseBody public WebAsyncTask
方式四:DeferredResult可以处理一些相对复杂一些的业务逻辑,最主要还是可以在另一个线程里面进行业务处理及返回,即可在两个完全不相干的线程间的通信 。
@RequestMapping(value = "/email/deferredResultReq", method = GET) @ResponseBody public DeferredResult<String> deferredResultReq () { System.out.println("外部线程:" + Thread.currentThread().getName()); //设置超时时间 DeferredResult<String> result = new DeferredResult<String>(60*1000L); //处理超时事件 采用委托机制 result.onTimeout(new Runnable() { @Override public void run() { System.out.println("DeferredResult超时"); result.setResult("超时了!"); } }); result.onCompletion(new Runnable() { @Override public void run() { //完成后 System.out.println("调用完成"); } }); myThreadPoolTaskExecutor.execute(new Runnable() { @Override public void run() { //处理业务逻辑 System.out.println("内部线程:" + Thread.currentThread().getName()); //返回结果 result.setResult("DeferredResult!!"); } }); return result; }
推荐阅读
- 使用Python+Fabric实现Linux自动化操作
- 硬盘变RAW了怎么办?
- 凭借这5步,我30分钟学会了Python爬虫
- WSL2 中使用 systemctl 命令
- 交管12123使用时间段是多久?
- 逾期很久的信用卡还清了还能继续用吗? 逾期过后的信用卡还清后还可以使用么
- 使用 UEFI 双启动 Windows 和 Linux
- 很多人学Spring框架,总觉得IOC模糊不清?
- 使用python爬取抖音app视频
- 使用Docker镜像