异步功能流程图:
DefferedResult
@RequestMapping
(value=
"/asynctask"
, method = RequestMethod.GET)
public
DeferredResult<ModelAndView> asyncTask(){
DeferredResult<ModelAndView> deferredResult =
new
DeferredResult<ModelAndView>();
System.out.println(
"/asynctask 调用!thread id is : "
+ Thread.currentThread().getId());
/**
模拟处理业务逻辑,处理结束后调用
LongTermTaskCallback接口中的callBack函数
**/
longTimeAsyncCallService.makeRemoteCallAndUnknownWhenFinish(
new
LongTermTaskCallback() {
@Override
public
void
callback(Object result) {
System.out.println(
"异步调用执行完成, thread id is : "
+ Thread.currentThread().getId());
ModelAndView mav =
new
ModelAndView(
"remotecalltask"
);
mav.addObject(
"result"
, result);
deferredResult.setResult(mav);
}
});
}
longTimeAsyncCallService是一个模拟长时间异步调用的服务类,调用之,立即返回,当它处理完成时候,就钩起一个线程调用我们提供的回调函数
public
interface
LongTermTaskCallback {
void
callback(Object result);
}
public
class
LongTimeAsyncCallService {
private
final
int
CorePoolSize =
4
;
private
final
int
NeedSeconds =
3
;
private
Random random =
new
Random();
private
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(CorePoolSize);
public
void
makeRemoteCallAndUnknownWhenFinish(LongTermTaskCallback callback){
System.out.println(
"完成此任务需要 : "
+ NeedSeconds +
" 秒"
);
scheduler.schedule(
new
Runnable() {
@Override
public
void
run() {
callback.callback(
"长时间异步调用完成."
);
}
},
"这是处理结果:)"
, TimeUnit.SECONDS);
}
}
WebAsyncTask
@RequestMapping
(value=
"/longtimetask"
, method = RequestMethod.GET)
public
WebAsyncTask longTimeTask(){
System.out.println(
"/longtimetask被调用 thread id is : "
+ Thread.currentThread().getId());
Callable<ModelAndView> callable =
new
Callable<ModelAndView>() {
public
ModelAndView call()
throws
Exception {
Thread.sleep(
3000
);
//假设是一些长时间任务
ModelAndView mav =
new
ModelAndView(
"longtimetask"
);
mav.addObject(
"result"
,
"执行成功"
);
System.out.println(
"执行成功 thread id is : "
+ Thread.currentThread().getId());
return
mav;
}
};
return
new
WebAsyncTask(callable);
}
处理超时
WebAsyncTask:
@RequestMapping
(value=
"/longtimetask"
, method = RequestMethod.GET)
public
WebAsyncTask longTimeTask(){
System.out.println(
"/longtimetask被调用 thread id is : "
+ Thread.currentThread().getId());
Callable<ModelAndView> callable =
new
Callable<ModelAndView>() {
public
ModelAndView call()
throws
Exception {
Thread.sleep(
3000
);
//假设是一些长时间任务
ModelAndView mav =
new
ModelAndView(
"longtimetask"
);
mav.addObject(
"result"
,
"执行成功"
);
System.out.println(
"执行成功 thread id is : "
+ Thread.currentThread().getId());
return
mav;
}
};
/**
超时设置2000毫秒,超过则返回
执行超时
**/
WebAsyncTask asyncTask =
new
WebAsyncTask(
2000
, callable);
asyncTask.onTimeout(
new
Callable<ModelAndView>() {
public
ModelAndView call()
throws
Exception {
ModelAndView mav =
new
ModelAndView(
"longtimetask"
);
mav.addObject(
"result"
,
"执行超时"
);
System.out.println(
"执行超时 thread id is :"
+ Thread.currentThread().getId());
return
mav;
}
}
);
return
new
WebAsyncTask(
3000
, callable);
}
DefferedResult:
@RequestMapping
(value =
"/asynctask"
, method = RequestMethod.GET)
public
DeferredResult<ModelAndView> asyncTask() {
DeferredResult<ModelAndView> deferredResult =
new
DeferredResult<ModelAndView>(2000L);
System.out.println(
"/asynctask 调用!thread id is : "
+ Thread.currentThread().getId());
longTimeAsyncCallService.makeRemoteCallAndUnknownWhenFinish(
new
LongTermTaskCallback() {
@Override
public
void
callback(Object result) {
System.out.println(
"异步调用执行完成, thread id is : "
+ Thread.currentThread().getId());
ModelAndView mav =
new
ModelAndView(
"remotecalltask"
);
mav.addObject(
"result"
, result);
deferredResult.setResult(mav);
}
});
deferredResult.onTimeout(
new
Runnable() {
@Override
public
void
run() {
System.out.println(
"异步调用执行超时!thread id is : "
+ Thread.currentThread().getId());
ModelAndView mav =
new
ModelAndView(
"remotecalltask"
);
mav.addObject(
"result"
,
"异步调用执行超时"
);
deferredResult.setResult(mav);
}
});
return
deferredResult;
}
超时归超时,超时并不会打断正常执行流程;
但注意,出现超时后我们给客户端返回了“超时”的结果,那接下来即便正常处理流程成功,客户端也收不到正常处理成功所产生的结果了