笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

sprint boot 高并发处理/Callable/DeferredResult

Posted on 2024-05-31 15:14  草妖  阅读(6)  评论(0)    收藏  举报

参照详情连接地址:SpringBoot异步实现DeferredResult实战与原理分析 - 掘金 (juejin.cn),如果需要查看请跳转查阅,本文仅作笔记记录。

案例代码:

返回模型UserModel.java:

package com.namejr.bean;

public class UserModel {
    public Integer userID;
    public String userName;
}

访问接口PublicController.java

package com.namejr.controller;

import com.namejr.bean.UserModel;
import com.namejr.serviceImpl.PublicServiceImpl;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

import java.util.concurrent.Callable;

@RestController
@RequestMapping(value = "/api/public")
@Validated
public class PublicController {
@Autowired
private PublicServiceImpl pServiceImpl;

@RequestMapping(value = "/getServerTime", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public String getServerTime() {
return DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
}

@RequestMapping(value = "/runCallAble", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public Callable<UserModel> runCallAble() {
Callable<UserModel> tempUserInfo= () -> {
try{
UserModel tempUserInfo1 =new UserModel();
tempUserInfo1.userID=1;
tempUserInfo1.userName="namejr";
Thread.sleep(12000); // 模拟超时处理
System.out.println("将会返回结果");
return tempUserInfo1;
}catch (Exception err){
System.out.println("错误:"+err.getMessage());
}
return null;
};
System.out.println("将会挂起/闲置/程序。。。");
return tempUserInfo;
}

@RequestMapping(value = "/runDeferredResult", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
public DeferredResult<UserModel> runEventListen() {
DeferredResult<UserModel> backUserInfo=new DeferredResult<>(13000L,"后台执行超时!!!");
    /**
    backUserInfo.onCompletion(()->{System.out.println("执行完成回调!");});
    */
new Thread(()->{
try{
UserModel tempUserInfo=new UserModel();
tempUserInfo.userID=1;
tempUserInfo.userName="namejr";
Thread.sleep(12000); // 模拟超时处理
System.out.println("将会返回结果");
// 返回结果的情况两种:1.使用.setResult进行返回处理,2.超时
backUserInfo.setResult(tempUserInfo);
}catch (Exception err){
System.out.println("错误:"+err.getMessage());
}
}).start();
System.out.println("将会挂起/闲置/程序。。。");
return backUserInfo;
}
}