配置变更,客户端通过长轮询请求服务端,服务端通过DeferredResult实现变更通知 消息推送,对于一些服务端发生变更,需要向客户端发送消息通知的场景,不管是C/S还是B/S模式,也可以通过DeferredResult...三、使用方式 1.编写DeferredResult返回类型api @GetMapping("/deferredresult/test") public DeferredResult testDeferredResult...(long sleepTime) { DeferredResult deferredResult = new DeferredResult(5000L,"server side...; } 2.接口调用 这样就完成了DeferredResult异步调用,当然我们也可以在DeferredResult设置超时相关逻辑。...接收到请求后,将请求暂存并且释放容器线程,用来接收新的请求 容器超时逻辑和业务正常处理逻辑将结果塞到DeferredResult返回调 spring对于DeferredResult请求处理 1.请求预处理
(); // Save the deferredResult somewhere.....return deferredResult; } // In some other thread... deferredResult.setResult(data); 如果对Servlet 3.0...因为DeferredResult技术,所以使得long polling不会一直占用容器资源,使得长轮询成为可能。...(0L); deferredResultMap.put(deferredResult.hashCode(),deferredResult); deferredResult.onCompletion...("还剩"+deferredResultMap.size()+"个deferredResult未响应"); }); return deferredResult;
利用它们,我们可以异步生成返回值,在具体处理的过程中,我们直接在controller中返回相应的Callable或者DeferredResult,在这之后,servlet线程将被释放,可用于其他连接;DeferredResult...DeferredResult异步调用 前面铺垫了那么多,还是主要来说DeferredResult的;和Callable一样,DeferredResult也是为了支持异步调用。...这里Sunny将会设计两个DeferredResult使用场景。...*/ public void put(DeferredResult> deferredResult){ taskId++;...DeferredResult对象,并将传入的参数设定为结果 首先我们来看看DeferredResult的集合类: @Component @Data public class TaskSet {
这种方案spring给我们提供了DeferredResult和Callable方式实现, 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持。...方式 DeferredResult使用方式与Callable类似,但在返回结果上不一样,它返回的时候实际结果可能没有生成,实际的结果可能会在另外的线程里面设置到DeferredResult中去。...接下来将对DeferredResult的处理流程进行说明,并实现一个较为简单的示例。...DeferredResult的处理过程与Callback类似,不一样的地方在于它的结果不是DeferredResult直接返回的,而是由其它线程通过同步的方式设置到该对象中。...Callback和DeferredResult用于设置单个结果。
return "someView"; } }; } DeferredResult The sequence for DeferredResult is very similar...The application sets the DeferredResult from some thread and Spring MVC dispatches the request back to...@RequestMapping("/quotes") @ResponseBody public DeferredResult quotes() { DeferredResult deferredResult = new DeferredResult(); // Save the deferredResult somewhere.....return deferredResult; } // In some other thread... deferredResult.setResult(data);
实现 DeferredResult使用方式与Callable类似,但在返回结果时不一样,它返回的时实际结果可能没有生成,实际的结果可能会在另外的线程里面设置到DeferredResult中去。...> quotes() { DeferredResult deferredResult = new DeferredResult(); // Save the deferredResult...return deferredResult; } // In some other thread... deferredResult.setResult(data); 上述示例中我们可以发现DeferredResult... helloGet() throws Exception { DeferredResult deferredResult = new DeferredResult...,比如当某个操作是异步时,可以先保存对应的DeferredResult对象,当异步通知回来时,再找到这个DeferredResult对象,在setResult处理结果即可。
Java 自带的 Future 框架可以这么用JDBC: @GetMapping public DeferredResult get() { DeferredResult deferredResult...= new DeferredResult(); CompletableFuture.supplyAsync(() -> { return 阻塞数据库IO; /...来实现异步回调写入结果返回 deferredResult.setResult(result); }); return deferredResult; } WebFlux 也可以使用阻塞JDBC...get() { DeferredResult deferredResult = new DeferredResult(); getResultFromDB().setHandler(asyncResult...()); } else { deferredResult.setErrorResult(asyncResult.cause());
利用它们,我们可以异步生成返回值,在具体处理的过程中,我们直接在controller中返回相应的Callable或者DeferredResult,在这之后,servlet线程将被释放,可用于其他连接;DeferredResult...DeferredResult异步调用 前面铺垫了那么多,还是主要来说DeferredResult的;和Callable一样,DeferredResult也是为了支持异步调用。...这里Sunny将会设计两个DeferredResult使用场景。... */ public void put(DeferredResult> deferredResult){ taskId++;...DeferredResult对象,并将传入的参数设定为结果 首先我们来看看DeferredResult的集合类: @Component @Data public class TaskSet {
为什么要写DeferredResult异步处理 虽然我们已经学会使用Callable去异步处理我们的请求,但是因为Runnable这种形式不能满足我们所有的场景。...在这种相似的场景下面Runnable显然不能满足我们的需求了,这时就要用到我们的DeferredResult。下面我们来写一个段代码来看如何用DeferredResult来实现我们的异步请求。...> map = new HashMap>(); public Map> getMap() { return map; } public void setMap(Map> map) {... result = new DeferredResult(); deferredResultHolder.getMap().put(orderNumber, result);
DeferredResult可以允许容器线程快速释放以便可以接受更多的请求提升吞吐量,让真正的业务逻辑在其他的工作线程中去完成。...deferredResult = new DeferredResult(); //当deferredResult完成时(不论是超时还是异常还是正常完成),移除watchRequests中相应的watch...(namespace, deferredResult); logger.info(“Servlet thread released”); return deferredResult; } //模拟发布namespace...deferredResult : deferredResults) { deferredResult.setResult(namespace + ” changed:” + time); } }...DeferredResult完成的时候记得移除MultiMap中相应的key,避免内存溢出请求。
DeferredResult 在Servlet容器中启动异步支持之后,controller的方法可以通过DeferredResult包装返回值来支持异步处理。...例如: @GetMapping("/quotes") @ResponseBody public DeferredResult quotes() { DeferredResult deferredResult = new DeferredResult(); // Save the deferredResult somewhere.....DeferredResult处理过程: controller返回一个DeferredResult并且将其保存到内存中的队列或者列表中。...稍后DeferredResult返回结果,开始一个异步调用,重新映射到controller但是并不在调用controller,使用DeferredResult的返回值继续处理结果。
请求流程图 http1 http2 http3 thread1 thread2 thread3 解决方案 使用 DeferredResult 来实现异步的操作,当一个请求打过来时,先把它放到一个队列时,...* * @return */ @GetMapping("/create-order") public DeferredResult createOrder() { DeferredResult... deferredResult = new DeferredResult((long) 3000, "error order"); logger.info("发布建立订单的事件")...; applicationEventPublisher.publishEvent(deferredResult); return deferredResult; } 异步的订单处理核心逻辑,也是耗时的操作...* * @return */ @EventListener @Async public String processOrder(DeferredResult deferredResult
前言 上篇博文:【小家Spring】高性能关键技术之—体验Spring MVC的异步模式(Callable、WebAsyncTask、DeferredResult) 基础使用篇 介绍了Spring...那么本篇文章主要介绍一下异步模式的高级使用(ResponseBodyEmitter、SseEmitter、StreamingResponseBody) DeferredResult高级使用 上篇博文介绍的它的基本使用...,那么本文主要结合一些特殊的使用场景,来介绍下它的高级使用,让能更深刻的理解DeferredResult的强大之处。... deferredResult = new DeferredResult(); //当deferredResult完成时(不论是超时还是异常还是正常完成),都应该移除... deferredResult : deferredResults) { deferredResult.setResult(namespace + " changed
com.ctrip.framework.apollo.internals.RemoteConfigLongPollService#doLongPollingRefresh) 2、Config Service的notifications/v2接口接收到客户端上面发起的请求,不会立即返回结果,而是通过Spring DeferredResult...Config Service会把DeferredResult放到本地缓存中: private final Multimap deferredResults...变更通知时会根据key从缓存中获取DeferredResult,设置值,让挂起的请求返回给客户端,达到通知客户端的功能。...com.ctrip.framework.apollo.biz.message.DatabaseMessageSender#sendMessage) 4、Config Service后台异步线程默认每秒扫描更新通知消息表,如果有配置发布动作,会从步骤2中的DeferredResult...缓存获取对应的DeferredResult,并让NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回
SpringMVC 提供有两种异步方式,只要将 Controller 方法返回值修改下述类即可: DeferredResult Callable DeferredResult DeferredResult...() { // 设置超时时间 DeferredResult deferredResult = new DeferredResult(7000L); // 异步线程处理结束...deferredResult.setErrorResult("timeout error"); }); deferredResult.onError(throwable -> {...("error"); } }); log.info("servlet 线程处理结束"); return deferredResult; } 创建 DeferredResult...此时若有设置 DeferredResult#onCompletion 回调方法,将会触发该回调方法。
; @Service public class PushService { private DeferredResult deferredResult; public...DeferredResult getAsyncUpdate(){ deferredResult=new DeferredResult();...return deferredResult; } @Scheduled(fixedDelay = 3000) public void refresh(){ if(...deferredResult!...=null){ deferredResult.setResult("当前时间戳:"+System.currentTimeMillis()); } } }
taskService) { this.taskService = taskService; } @GetMapping("/deferred") public DeferredResult...executeSlowTask() { logger.info(Thread.currentThread().getName() + "进入executeSlowTask方法"); DeferredResult... deferredResult = new DeferredResult(); // 调用长时间执行任务 taskService.execute(deferredResult...; } }); // 处理完成的回调方法,无论是超时还是处理成功,都会进入这个回调方法 deferredResult.onCompletion...logger.info(Thread.currentThread().getName() + " onCompletion"); } }); return deferredResult
Java 自带的 Future框架可以这么用JDBC: @GetMapping public DeferredResult get() { DeferredResult deferredResult =...new DeferredResult(); CompletableFuture.supplyAsync(() -> { return 阻塞数据库IO; //...来实现异步回调写入结果返回 deferredResult.setResult(result); }); return deferredResult; } WebFlux 也可以使用阻塞JDBC...get() { DeferredResult deferredResult = new DeferredResult(); getResultFromDB().setHandler(asyncResult...()); } else { deferredResult.setErrorResult(asyncResult.cause());
从 Spring 3.2 开始,可以使用 DeferredResult 来实现异步处理。使用 DeferredResult 时,可以设置超时,超时之后自动返回超时错误响应。...在 NotificationControllerV2 中就使用了 Spring 的 DeferredResult来实现的。本文重在解决问题的思路,就不展示源码了,感兴趣的同学可以自己阅读一下源码。...不过,小黑同学写了一个简单的 demo 来帮助我们理解一下 DeferredResult 的使用。... info(String key) { // 设置 1 秒超时时间,设置超时是返回的结果 DeferredResult result =...deferredResults.put(key, result); // 如果超时,移除当前 DeferredResult,并打印日志,同时返回 DeferredResult
领取专属 10元无门槛券
手把手带您无忧上云