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)異步線程結束後,返回