observable

Spring MVC现在已经支持异步请求处理流程了一段时间,该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持。

Spring Web Async支持

考虑一个需要花一点时间处理的服务呼叫,该服务呼叫具有延迟:

public CompletableFuture<Message> getAMessageFuture() {return CompletableFuture.supplyAsync(() -> {logger.info("Start: Executing slow task in Service 1");Util.delay(1000);logger.info("End: Executing slow task in Service 1");return new Message("data 1");}, futureExecutor);
}

如果要在用户请求流中调用此服务,则传统的阻塞控制器流将如下所示:

@RequestMapping("/getAMessageFutureBlocking")
public Message getAMessageFutureBlocking() throws Exception {return service1.getAMessageFuture().get();
}

更好的方法是使用Spring异步支持,以便在CompletableFuture可用时将结果返回给用户,这样就不会占用容器线程了:

@RequestMapping("/getAMessageFutureAsync")
public DeferredResult<Message> getAMessageFutureAsync() {DeferredResult<Message> deffered = new DeferredResult<>(90000);CompletableFuture<Message> f = this.service1.getAMessageFuture();f.whenComplete((res, ex) -> {if (ex != null) {deffered.setErrorResult(ex);} else {deffered.setResult(res);}});return deffered;
}

在异步流中使用Observable

现在转到本文的主题,最近我一直在使用Rx-java的出色的Observable类型作为我的服务返回类型,并希望确保Web层在处理从服务调用返回的Observable类型时也保持异步。

考虑现在修改的上述服务以返回一个Observable:

public Observable<Message> getAMessageObs() {return Observable.<Message>create(s -> {logger.info("Start: Executing slow task in Service 1");Util.delay(1000);s.onNext(new Message("data 1"));logger.info("End: Executing slow task in Service 1");s.onCompleted();}).subscribeOn(Schedulers.from(customObservableExecutor));
}

我可以通过在Web层进行阻塞调用来结束返回Observable的所有好处,其中一个朴素的调用将是以下内容:

@RequestMapping("/getAMessageObsBlocking")
public Message getAMessageObsBlocking() {return service1.getAMessageObs().toBlocking().first();
}

为了使该流在Web层上异步,以下是处理此调用的更好方法,基本上是将Observable转换为Spring的DeferredResult类型:

@RequestMapping("/getAMessageObsAsync")
public DeferredResult<Message> getAMessageAsync() {Observable<Message> o = this.service1.getAMessageObs();DeferredResult<Message> deffered = new DeferredResult<>(90000);o.subscribe(m -> deffered.setResult(m), e -> deffered.setErrorResult(e));return deffered;
}

这将确保处理用户流的线程将在服务调用完成后立即返回,并且一旦可观察到的开始发出值,就将对用户响应进行React性处理。

如果您有兴趣进一步探索,这里是一个带有工作示例的github存储库:https://github.com/bijukunjummen/spring-web-observable。

参考文献:

Spring关于Web层中异步流的参考指南:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-async

NoBlogDefFound博客上无与伦比的Tomasz Nurkiewicz提供的有关Spring DeferredResult的更多详细信息-http://www.nurkiewicz.com/2013/03/deferredresult-asynchronous-processing.html

翻译自: https://www.javacodegeeks.com/2015/03/using-rx-java-observable-in-a-spring-mvc-flow.html

observable

observable_在Spring MVC流中使用rx-java Observable相关推荐

  1. rx.observable_在Spring MVC流中使用rx-java Observable

    rx.observable Spring MVC现在已经支持异步请求处理流程了一段时间,该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持. Spring Web Asyn ...

  2. 在Spring MVC流中使用rx-java Observable

    Spring MVC现在已经支持异步请求处理流程了一段时间,该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持. Spring Web Async支持 考虑一下需要花一点时 ...

  3. Spring MVC环境中的文件上传功能实现

    在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...

  4. java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...

    Spring MVC Controller中的一个读入和返回都是JSON的方法怎么获取javax.validation注解的错误信息? 本帖最后由 LonelyCoder2012 于 2014-03- ...

  5. spring mvc项目中利用freemarker生成自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> spring mvc项目中利用freemarker生成自定义标签 博客分类: java spring mvc +freemar ...

  6. Spring MVC框架中关于限制请求方式

    在Spring MVC框架中,@RequestMapping注解的主要作用是配置请求路径,除此以外,还可以配置请求方式,例如: @RequestMapping(value = "/add-n ...

  7. Spring MVC 应用中异常处理流程分析 : sendError() vs setStatus()

    sendError() Spring MVC应用处理某个请求时遇到异常的话,除非开发人员明确地指定使用setStatus(),否则都是面向sendError()的处理流程,总的来说该处理流程概括如下 ...

  8. Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解

    转载自https://blog.csdn.net/shinebar/article/details/54408020 引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的 ...

  9. 如何在Spring和Spring MVC项目中进行测试

    Spring框架概述 Spring大约包含了20个模块,这些模块组成了核心容器(Core Container).数据访问/集成(Data Access/Integration).Web.AOP(面向切 ...

最新文章

  1. Netty 粘包 拆包 编码 解码 序列化 介绍
  2. sql instr()与LOCATE()字符串查找函数
  3. UA MATH567 高维统计III 随机矩阵8 社区发现 Spectral Clustering的理论分析
  4. Hessian 初探
  5. 几个非常实用的JQuery代码片段
  6. db2 mysql sql server_连接数据库的方法(Oracle DB2 SQL Server MySQL...)
  7. 宁德时代预计一季度净利润超9.9亿元 同比增长超140%
  8. MyBatis动态插入的实现
  9. 如何批量修改网页 更新网站 一键保存 windows查看和排序
  10. LeetCode26.删除排序数组中的重复项
  11. FF的插件iMacros简单交流
  12. USGS下载遥感影像——以Landsat影像下载为例
  13. 纸牌、挖金子源码链接
  14. VS2005 执行控制台程序的时候,窗口一闪就没了的问题
  15. Win10教育版变为企业版
  16. 【寒江雪】空间中的点线和面
  17. C#WPF内存回收与释放LierdaCracker
  18. 【网络技术联盟站】瑞哥教你如何使用 Console 接口管理设备
  19. matlab处理矩阵的一些简易操作和画图的一些小技巧
  20. cpuid limit_Max CPUID Valut Limit 请懂电脑的解答下 谢谢!

热门文章

  1. 王彪20162321 2016-2017-2 《程序设计与数据结构》第7周学习总结
  2. parted磁盘分区与GPT
  3. linux ls文件颜色和底色设置
  4. expdp备份速度慢的问题
  5. SQL函数--- SQL FIRST()
  6. 用Eclipse进行远程Debug代码
  7. 关于JavaScript为何要限制跨域访问
  8. linux shell 显示文件最后几行
  9. python3 hashlib加密库 md5 sha1 sha256 sha384 sha512 加盐
  10. centos7 ntp设置 时间同步