基于 servlet3.0 的异步 请求 同步响应结果之 两种实现 方式
总结:有时候我们异步处理结果,异步处理完成一半都是在处理的那端推送 消息(如 sms,极光或者自定义的推送消息系统)通知用户处理结果,不会立马返回处理后的结果,一般返回 排队中,或者处理中,前端轮询 查询结果
有时候在想 有没有 异步处理 同步响应结果呢,答案是有的,一般会设置超时时间,避免长时间等待,代码如下:
例一:
/** * 延时结果请求 基于发布订阅机制 * 效果 就是 异步处理 同步返回响应结果 * @return */ @GetMapping("delayed") public DeferredResult get(){ //处理业务1 DeferredResult deferredResult = new DeferredResult(); //监听器处理 业务2 eventBusService.register(new IntegralEventListener()); eventBusService.post(deferredResult); return deferredResult; }
//监听器
@Subscribe public void listen(DeferredResult event){ //送积分 try { Thread.sleep(1000); } catch (InterruptedException e) { } event.setResult("ok"); log.info("异步结果响应: "); }
例二:
/** * 常规callable * @return * @throws ExecutionException * @throws InterruptedException */ @GetMapping("delayedCall") public Object getString() throws ExecutionException, InterruptedException { Future future = executor.submit(new Callable() { //处理业务1 @Override public CommonResult call() throws Exception { Thread.sleep(1000); return new CommonResult(); } }); //处理业务2 return future.get(); }
elk