spring DeferredResult

2023-01-19 07:57:37

可以实现异步、类似长连接,轮询查询配置改变,但是urlfilter不能对response进行参数输出

1、Callable

https://www.baidu.com/link?url=xj0t8IHKNM2awUY8nuVbW6bHtp06bcmweewygR6hRKh0CG5G6YPahtxpqkB9LUAE&wd=&eqid=9fbda7bc0021d5a7000000045d8c6b04

https://www.jianshu.com/p/fb0645033f0f 这个详细点

2、https://blog.csdn.net/smollsnail/article/details/79164826

https://blog.csdn.net/xiejiefeng333/article/details/84105685

https://www.cnblogs.com/aheizi/p/5659030.html

 

3、总结 https://blog.csdn.net/icarusliu/article/details/79539105

DeferredResult使用方式与Callable类似,但在返回结果上不一样,它返回的时候实际结果可能没有生成,实际的结果可能会在另外的线程里面设置到DeferredResult中去。 
该类包含以下日常使用相关的特性:

超时配置:通过构造函数可以传入超时时间,单位为毫秒;因为需要等待设置结果后才能继续处理并返回客户端,如果一直等待会导致客户端一直无响应,因此必须有相应的超时机制来避免这个问题;实际上就算不设置这个超时时间,应用服务器或者Spring也会有一些默认的超时机制来处理这个问题。
结果设置:它的结果存储在一个名称为result的属性中;可以通过调用setResult的方法来设置属性;由于这个DeferredResult天生就是使用在多线程环境中的,因此对这个result属性的读写是有加锁的。
接下来将对DeferredResult的处理流程进行说明,并实现一个较为简单的示例。

2.2.1 DeferredResult处理流程

DeferredResult的处理过程与Callback类似,不一样的地方在于它的结果不是DeferredResult直接返回的,而是由其它线程通过同步的方式设置到该对象中。它的执行过程如下所示:

客户端请求服务
SpringMVC调用Controller,Controller返回一个DeferredResult对象
SpringMVC调用ruquest.startAsync
DispatcherServlet以及Filters等从应用服务器线程中结束,但Response仍旧是打开状态,也就是说暂时还不返回给客户端
某些其它线程将结果设置到DeferredResult中,SpringMVC将请求发送给应用服务器继续处理
DispatcherServlet再次被调用并且继续处理DeferredResult中的结果,最终将其返回给客户端
 

  • 作者:清风2556
  • 原文链接:https://qingfeng2556.blog.csdn.net/article/details/101457820
    更新时间:2023-01-19 07:57:37