Java实现异步处理HTTP请求_方式二:通过DeferredResult

女爷i 2023-07-21 11:08 141阅读 0赞

1、DeferredResult

spring 支持http异步返回

2、异步处理

开启新线程,处理数据并赋值返回。

3、代码示例

1)controller

  1. package com.liuxd.controller;
  2. import com.liuxd.entity.Responses;
  3. import com.liuxd.service.TaskService2;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.context.request.async.DeferredResult;
  9. @Slf4j
  10. @RestController
  11. public class AsyncCtr2 {
  12. @Autowired
  13. private TaskService2 taskService2;
  14. @GetMapping(value = "/getResult")
  15. public DeferredResult<Responses<String>> getResult() {
  16. log.info("收到HTTP请求...");
  17. long startTime = System.currentTimeMillis();
  18. DeferredResult<Responses<String>> deferredResult = new DeferredResult<Responses<String>>();
  19. new Thread(new Runnable() {
  20. @Override
  21. public void run() {
  22. taskService2.getData(deferredResult);
  23. }
  24. }).start();
  25. log.info("接收HTTP请求线程任务已完成,退出!");
  26. long endTime = System.currentTimeMillis();
  27. log.info("http请求总耗时: " + (endTime - startTime) + "ms");
  28. return deferredResult;
  29. }
  30. }

2)service

  1. package com.liuxd.service;
  2. import com.liuxd.entity.Responses;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.web.context.request.async.DeferredResult;
  6. @Slf4j
  7. @Service
  8. public class TaskService2 {
  9. public void getData(DeferredResult<Responses<String>> deferredResult) {
  10. log.info("调用service异步有返回方法,开始执行...");
  11. long startTime = System.currentTimeMillis();
  12. try {
  13. Thread.sleep(2500L);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. log.info("调用service异步有返回方法,执行结束!!");
  18. long endTime = System.currentTimeMillis();
  19. log.info("调用service异步有返回方法总耗时: " + (endTime - startTime) + "ms");
  20. deferredResult.setResult(new Responses<>(0, "异步处理完成", "SUCCESS"));
  21. }
  22. }

3)Responses

  1. package com.liuxd.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Builder;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. @Data
  7. @Builder
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. public class Responses<T> {
  11. private Integer code;
  12. private String msg;
  13. private T data;
  14. }

4)打印结果

20200403151817127.png

5)结果分析

1)http主线程接受请求,处理完请求后线程结束

2)异步线程结束后,返回

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用DeferredResult异步处理请求

         我们在实际开发的过程中,可能会遇到需要长轮循的情况。      长轮询指的是客户端向服务端发送一个请求,然后服务端将该请求hold住,另起线程进行处理,处理完后,再