总共有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"; // 异步执行结果
});
}
}