spring boot servelt异步调用

总共有3中异步调用的方式

  • Callable
  • DeferredResult
  • CompletionStage

 

 

/**
 * 监控controller
 *
 * @author wyzhang
 * @date 2020/9/22 16:46
 */
@Controller
@RestController("/api/monitor")
@EnableScheduling
@Slf4j
public class SyncController {


  private final BlockingQueue<DeferredResult<String>> queue = new ArrayBlockingQueue<>(5);

  // 超时随机数
  private final Random random = new Random();

  @Scheduled(fixedRate = 5000)
  public void process() throws InterruptedException { // 定时操作
    DeferredResult<String> result = null;
    do {
      result = queue.take();
      // 随机超时时间
      long timeout = random.nextInt(1000);
      // 模拟等待时间,RPC 或者 DB 查询
      Thread.sleep(timeout);
      // 计算结果
//      result.setResult("Hello,World");
      result.setErrorResult("error");
      log.error("执行计算结果,消耗:" + timeout + " ms.");
    } while (result != null);
  }

  @GetMapping("/callable-hello-world")
  public Callable<String> callableHelloWorld() {
    final long startTime = System.currentTimeMillis();

    log.error("Hello,World");

    return () -> {
      long costTime = System.currentTimeMillis() - startTime;
      log.error("执行计算结果,消耗:" + costTime + " ms.");
//      throw new IllegalArgumentException("参数错误");
      return "Hello,World";
    };
  }

  @RequestMapping(value = "/set/{result}", method = RequestMethod.GET)
  public String setResult(@PathVariable("result") String result) {

    return "setResult is" + result;
  }


  @RequestMapping(value = "/getResult", method = RequestMethod.GET)
  public DeferredResult<String> getResult() throws InterruptedException {
    DeferredResult<String> result = new DeferredResult<>(1000L);
    queue.put(result);

    return result;
  }

  @RequestMapping(value = "/getResultInterrupted", method = RequestMethod.GET)
  public DeferredResult<String> getResultInterrupted() throws InterruptedException {
    DeferredResult<String> result = new DeferredResult<>(1000L, () -> {
      throw new IllegalArgumentException("getResult error");
    });
    return result;
  }

  @GetMapping("/completion-stage")
  public CompletionStage<String> completionStage(){
    final long startTime = System.currentTimeMillis();

    System.out.println("Hello,World");

    return CompletableFuture.supplyAsync(()->{
      long costTime = System.currentTimeMillis() - startTime;
      System.out.println("执行计算结果,消耗:" + costTime + " ms.");
      return "Hello,World"; // 异步执行结果
    });
  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值