参照详情连接地址:SpringBoot异步实现DeferredResult实战与原理分析 - 掘金 (juejin.cn),如果需要查看请跳转查阅,本文仅作笔记记录。
案例代码:
返回模型UserModel.java:
package com.namejr.bean; public class UserModel { public Integer userID; public String userName; }
访问接口PublicController.java:
package com.namejr.controller;
import com.namejr.bean.UserModel;
import com.namejr.serviceImpl.PublicServiceImpl;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
import java.util.concurrent.Callable;
@RestController
@RequestMapping(value = "/api/public")
@Validated
public class PublicController {
@Autowired
private PublicServiceImpl pServiceImpl;
@RequestMapping(value = "/getServerTime", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public String getServerTime() {
return DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
}
@RequestMapping(value = "/runCallAble", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public Callable<UserModel> runCallAble() {
Callable<UserModel> tempUserInfo= () -> {
try{
UserModel tempUserInfo1 =new UserModel();
tempUserInfo1.userID=1;
tempUserInfo1.userName="namejr";
Thread.sleep(12000); // 模拟超时处理
System.out.println("将会返回结果");
return tempUserInfo1;
}catch (Exception err){
System.out.println("错误:"+err.getMessage());
}
return null;
};
System.out.println("将会挂起/闲置/程序。。。");
return tempUserInfo;
}
@RequestMapping(value = "/runDeferredResult", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public DeferredResult<UserModel> runEventListen() {
DeferredResult<UserModel> backUserInfo=new DeferredResult<>(13000L,"后台执行超时!!!");
/**
backUserInfo.onCompletion(()->{System.out.println("执行完成回调!");});
*/
new Thread(()->{
try{
UserModel tempUserInfo=new UserModel();
tempUserInfo.userID=1;
tempUserInfo.userName="namejr";
Thread.sleep(12000); // 模拟超时处理
System.out.println("将会返回结果");
// 返回结果的情况两种:1.使用.setResult进行返回处理,2.超时
backUserInfo.setResult(tempUserInfo);
}catch (Exception err){
System.out.println("错误:"+err.getMessage());
}
}).start();
System.out.println("将会挂起/闲置/程序。。。");
return backUserInfo;
}
}