rx.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

rx.observable

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

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

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

  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. 拉格朗日乘子法(Lagrange Multiplier)和KKT条件
  2. ios 判断app程序第一次启动方法
  3. adas技术实现途径_未来实现100%清洁电力的途径,带来巨大的健康和工作
  4. 你知道如何用面向对象思想写好并发编程吗?
  5. 比较交换/(选择)排序法和冒泡排序法(C语言)
  6. Windows Phone 7 Coding4Fun的弹出框
  7. 29. 在magento CMS中的标签变量使用
  8. DL_C1_week_2_2(Logistic Regression)
  9. 大二java课程设计题目_java课程设计题目.doc
  10. 高通qxdm抓取sensor的log【学习笔记】
  11. Android人脸支付功能,终于来了,华为Mate20 Pro微信人脸支付功能已上线
  12. 苹果笔记本电脑亮度无法调节_macbook怎么调节屏幕亮度|苹果笔记本调显示器亮度方法...
  13. 树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯
  14. 视频剪辑软件,AI智能合并随机生成新视频,并设置视频数量以及时长
  15. [胡说八道]我的时间我做主——读《小强升职记》有感
  16. 为什么Facebook需要养号?Facebook养号系统有什么作用?
  17. 思考:苟日新,日日新,又日新
  18. STM32 Keil快速新建工程
  19. 使用字典统计不同班级的成绩(d.get()函数的灵活应用)
  20. 明日之后android和ios,明日之后安卓苹果互通吗

热门文章

  1. CF786E-ALT【网络流,倍增】
  2. 欢乐纪中A组赛【2019.8.17】
  3. jzoj1029-电子眼【树形dp】
  4. 2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)
  5. 2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)
  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love counting(Trie树)
  7. 【交互】【随机】Lost Root(CF1061F)
  8. html的<input type='radio'/>change事件坑
  9. 教你用 3 台机器搞定一个 Redis 高可用架构
  10. 漫画:什么是MD5算法