在高并发请求下,可根据实际业务场景,采取异步数据处理方法,例如在接收到大量请求数据后,发送端不必第一时刻获取数据处理结果,可以把请求数据放到队列中,再开启一个后端服务轮询多线程处理请求数据。
Java代码示例如下
一,自定义队列
//UdsInfoRequestParams为业务系统要处理的业务数据
public class RequestQueue {
private ConcurrentLinkedQueue<AsyncVo<UdsInfoRequestParams, Object>> udsInfoQueue = new ConcurrentLinkedQueue();
public Queue getUdsInfoQueue() {
return udsInfoQueue;
}
}
public class AsyncVo<I, O> {
/**
* 请求参数
*/
private I params;
/**
* 响应结果
*/
private DeferredResult<O> result;
public I getParams() {
return params;
}
public void setParams(I params) {
this.params = params;
}
public DeferredResult<O> getResult() {
return result;
}
public void setResult(DeferredResult<O> result) {
this.result = result;
}
}
二 提供接口接收数据代码示例
@NoAuth
@PostMapping("/udsConfigFileUpload")
public String addHouseImageApi(@RequestParam(value = "file") MultipartFile[] files,UdsInfoRequestParams udsInfoRequestParams){
try{
log.info("pending deal uds info size is: " + requestQueue.getUdsInfoQueue().size());
log.info(udsInfoRequestParams.getEsn() + " report file size is: " + files[0].getSize());
AsyncVo<UdsInfoRequestParams, Object> vo = new AsyncVo<>();
udsInfoRequestParams.setBytes(files[0].getBytes());
udsInfoRequestParams.setOriginalFileName(files[0].getOriginalFilename());
vo.setParams(udsInfoRequestParams);
requestQueue.getUdsInfoQueue().offer(vo);
log.info("pending deal uds info size is: " + requestQueue.getUdsInfoQueue().size());
udsInfoRequestParams = null;
return "send uds info success";
}catch (Exception e){
log.error("upload uds config file with error " + e.getMessage());
return "send uds info failed";
}
}
三 后端服务实时处理队列数据
cachedThreadPool.execute(() -> {
AsyncVo<UdsInfoRequestParams, Object> vo = (AsyncVo<UdsInfoRequestParams, Object>)queue.getUdsInfoQueue().poll();
if(null != vo){
log.info("uds task deal with uds info begin");
UdsInfoRequestParams udsInfoRequestParams = vo.getParams();
byte[] bytes = udsInfoRequestParams.getBytes();
String esn = udsInfoRequestParams.getEsn();
String terminalNo = udsInfoRequestParams.getTerminalNo();
String originalFileName = udsInfoRequestParams.getOriginalFileName();
String status = udsInfoRequestParams.getStatus();
String errorCode = "0";
if(StringUtils.isNotEmpty(udsInfoRequestParams.getErrorCode())
&& Integer.valueOf(udsInfoRequestParams.getErrorCode()) < 10000){
errorCode = udsInfoRequestParams.getErrorCode();
}
String operateType = udsInfoRequestParams.getOperateType();
.........