Java实现异步处理HTTP请求_方式二:通过DeferredResult
1、DeferredResult
spring 支持http异步返回
2、异步处理
开启新线程,处理数据并赋值返回。
3、代码示例
1)controller
package com.liuxd.controller;
import com.liuxd.entity.Responses;
import com.liuxd.service.TaskService2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
@Slf4j
@RestController
public class AsyncCtr2 {
@Autowired
private TaskService2 taskService2;
@GetMapping(value = "/getResult")
public DeferredResult<Responses<String>> getResult() {
log.info("收到HTTP请求...");
long startTime = System.currentTimeMillis();
DeferredResult<Responses<String>> deferredResult = new DeferredResult<Responses<String>>();
new Thread(new Runnable() {
@Override
public void run() {
taskService2.getData(deferredResult);
}
}).start();
log.info("接收HTTP请求线程任务已完成,退出!");
long endTime = System.currentTimeMillis();
log.info("http请求总耗时: " + (endTime - startTime) + "ms");
return deferredResult;
}
}
2)service
package com.liuxd.service;
import com.liuxd.entity.Responses;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.async.DeferredResult;
@Slf4j
@Service
public class TaskService2 {
public void getData(DeferredResult<Responses<String>> deferredResult) {
log.info("调用service异步有返回方法,开始执行...");
long startTime = System.currentTimeMillis();
try {
Thread.sleep(2500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("调用service异步有返回方法,执行结束!!");
long endTime = System.currentTimeMillis();
log.info("调用service异步有返回方法总耗时: " + (endTime - startTime) + "ms");
deferredResult.setResult(new Responses<>(0, "异步处理完成", "SUCCESS"));
}
}
3)Responses
package com.liuxd.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Responses<T> {
private Integer code;
private String msg;
private T data;
}
4)打印结果
5)结果分析
1)http主线程接受请求,处理完请求后线程结束
2)异步线程结束后,返回
还没有评论,来说两句吧...