package
cn.bridgeli.deferredresulttest.service;
import
cn.bridgeli.deferredresulttest.entity.DeferredResultResponse;
import
org.springframework.http.HttpStatus;
import
org.springframework.stereotype.Service;
import
org.springframework.web.context.request.async.DeferredResult;
import
java.util.Map;
import
java.util.Optional;
import
java.util.concurrent.ConcurrentHashMap;
import
java.util.function.Consumer;
/**
* @author bridgeli
*/
@Service
public
class
DeferredResultService {
private
Map<string, consumer<deferredresultresponse=
""
>> taskMap;
public
DeferredResultService() {
taskMap =
new
ConcurrentHashMap<>();
}
/**
* 将请求id与setResult映射
*
* @param requestId
* @param deferredResult
*/
public
void
process(String requestId, DeferredResult<deferredresultresponse> deferredResult) {
deferredResult.onTimeout(() -> {
taskMap.remove(requestId);
DeferredResultResponse deferredResultRespOnse=
new
DeferredResultResponse();
deferredResultResponse.setCode(HttpStatus.REQUEST_TIMEOUT.value());
deferredResultResponse.setMsg(DeferredResultResponse.Msg.TIMEOUT.getDesc());
deferredResult.setResult(deferredResultResponse);
});
Optional.ofNullable(taskMap)
.filter(t -> !t.containsKey(requestId))
.orElseThrow(() ->
new
IllegalArgumentException(String.format(
"requestId=%s is existing"
, requestId)));
taskMap.putIfAbsent(requestId, deferredResult::setResult);
}
/**
* 这里相当于异步的操作方法
* 设置DeferredResult对象的setResult方法
*
* @param requestId
* @param deferredResultResponse
*/
public
void
settingResult(String requestId, DeferredResultResponse deferredResultResponse) {
if
(taskMap.containsKey(requestId)) {
Consumer<deferredresultresponse> deferredResultRespOnseConsumer= taskMap.get(requestId);
deferredResultResponseConsumer.accept(deferredResultResponse);
taskMap.remove(requestId);
}
}
}</deferredresultresponse></deferredresultresponse></string,>