「javaasync标签」spring async标签最佳实践

博主:adminadmin 2022-12-18 22:24:07 67

今天给各位分享javaasync标签的知识,其中也会对spring async标签最佳实践进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

script标签中的defer和async有什么区别?什么情况用defer好,什么情况用async好?

defer使得browsers延迟脚本的执行,直到文档的载入和解析完成,并可以操作(在onload事件触发前)。

async使得browsers可以尽快地执行脚本,而不用在下载脚本时阻塞文档解析(异步)。在不支持async的browsers中,通过动态创建script元素并把它插入文档中,来实现脚本的异步载入和执行。

若两个属性同在,会忽略defer而遵从async

springmvc怎样异步处理

Spring MVC 3.2开始引入Servlet 3中的基于异步的处理request.往常是返回一个值,而现在是一个Controller方法可以返回一个java.util.concurrent.Callable对象和从Spring MVC的托管线程生产返回值.同时Servlet容器的主线程退出和释放,允许处理其他请求。Spring MVC通过TaskExecutor的帮助调用Callable在一个单独的线程。并且当这个Callable返回时,这个rquest被分配回Servlet容器使用由Callable的返回值继续处理。

这里有这样的Controller方法的一个例子:

@RequestMapping(method=RequestMethod.POST)

public CallableString processUpload(final MultipartFile file) {

return new CallableString() {

public String call() throws Exception {

// ...

return "someView";

}

};

}1234567891011

Controller方法的另外一个选择是返回一个DeferredResult的实例。在这种情况下,返回值也将由多线程产生.i.e. 一个不是由Spring MVC托管。例如可能产生的结果在应对一些外部事件,比如JMS消息,一个计划任务等等.这里有这样的Controller方法的一个例子:

@RequestMapping("/quotes")

@ResponseBody

public DeferredResultString quotes() {

DeferredResultString deferredResult = new DeferredResultString();

// Save the deferredResult somewhere..

return deferredResult;

}

// In some other thread...

deferredResult.setResult(data);12345678910

如果你没有了解过Servlet 3.0中的异步处理request的特性,这可能有点难以理解.这肯定会帮助阅读.这里有一些关于底层机制基本原理:

1、Servlet 3.0 异步机制

一个ServletRequest可以通过调用 request.startAsync()被放到一个异步的模块中.这样做的主要作用是Servlet,以及任何过滤器,可以退出,但是响应仍将允许开放直到处理完成后。

调用request.startAsync()返回AsyncContext可以用于进一步控制异步处理。例如,它提供一个方法叫dispatch,这个类似于Servlet API,并且它允许应用程序通过Servlet容器线程继续请求处理。

ServletRequest提供获取当前DispatcherType的接口.DispatcherType可以用来区分处理初始请求,一个异步分发,forward,以及其他分发类型。

记住上面的,下面是通过Callable异步请求处理事件的序列:

Controller返回一个Callable对象.

Spring MVC开始异步处理并且提交Callable到TaskExecutor在一个单独的线程中进行处理。

DispatcherServlet与所有的Filter的Servlet容器线程退出,但Response仍然开放。

Callable产生结果并且Spring MVC分发请求给Servlet容器继续处理.

DispatcherServlet再次被调用并且继续异步的处理由Callable产生的结果

DeferredResult的处理顺序与Callable十分相似,由应用程序多线程产生异步结果:

Controller返回一个DeferredResult对象,并且把它保存在内在队列当中或者可以访问它的列表中。

Spring MVC开始异步处理.

DispatcherServlet与所有的Filter的Servlet容器线程退出,但Response仍然开放。

application通过多线程返回DeferredResult中sets值.并且Spring MVC分发request给Servlet容器.

DispatcherServlet再次被调用并且继续异步的处理产生的结果.

为进一步在异步请求处理动机的背景,并且when或者why使用它请看this blog post series.

2、异步请求的异常处理

当Callable执行一个Controller方法的时候带有异常怎么办?简单的回答就是:和当执行一个普通Controller方法带有异常一样.它通过有规律的异常处理机制。详细点来说就是:当Callable带有异常时,Spring MVC以这个Exception为结果分发给Servlet容器.并且引导带有Exception处理request而不是Controller方法返回一个值。当使用DeferredResult时,你可以选择是否把Exception实例通过调用setResult或者setErrorResult进行传值.

3、拦截异步请求

一个HandlerInterceptor可样也可以实现AsyncHandlerInterceptor,通过实现它的afterConcurrentHandlingStarted方法进行回调.当进行异步处理的时候,将会调用afterConcurrentHandlingStarted而不是postHandle和afterCompletion.

一个HandlerInterceptor同样可以注册CallableProcessingInterceptor或者一个DeferredResultProcessingInterceptor用于更深度的集成异步request的生命周期.例如处理一个timeout事件.你可以参看AsyncHandlerInterceptor的Javadoc了解更多细节.

DeferredResult类也提供了方法,像onTimeout(Runnable)和onCompletion(Runnable).可以看DeferredResult了解更多细节.

当使用Callable的时候,你可以通过WebAsyncTask来对它进行包装.这样也可以提供注册timeout与completion方法.

4、HTTP Streaming

一个Controller方法可以通过使用DeferredResult与Callable来异步的产生它的返回值.并且这个可以被用来实现long polling技术.就是服务器可以推动事件尽快给客户端。

如果当你需要在一个HTTP response中放入多个event怎么办?这个技术需要”Long Polling”.这就是所谓的”Long Polling”.Spring MVC通过使用ResponseBodyEmitter做为返回值来实现这种功能.这样可以被用来发送多个Object。而不是使用@ResponseBody这样。这样每个对象都可以对应一种HttpMessageConverter被写入到response中。

下面是一个简单的例子:

@RequestMapping("/events")

public ResponseBodyEmitter handle() {

ResponseBodyEmitter emitter = new ResponseBodyEmitter();

// Save the emitter somewhere..

return emitter;

}

// In some other thread

emitter.send("Hello once");

// and again later on

emitter.send("Hello again");

// and done at some point

emitter.complete();123456789101112131415

注意:ResponseBodyEmitter同样也可以用做ResponseEntity中的body,用于定制化response的status与headers.

5、HTTP Streaming With Server-Sent Events

SseEmitter是ResponseBodyEmitter的子类,它提供Server-Sent Events.服务器事件发送是”HTTP Streaming”的另一个变种技术.只是从服务器发送的事件按照W3C Server-Sent Events规范来的.

Server-Sent Events能够来用于它们的预期使用目的,就是从server发送events到clients.在Spring MVC中可以很容易的实现.仅仅需要返回一个SseEmitter类型的值.

注意:IE浏览器并不支持Server-Sent Events并且对于更高级的web应用程序消息传递场景:例如在线游戏,在线协作,金融应用以及其它.最好考虑使用Spring的WebSocket来支持.它包含SockJS-style WebSocket的仿真可以被广泛的浏览器加高。(包含IE浏览器).在一个消息中心架构中通过发布-订阅模型也能进行更高级别的与客户消息传递模式进行交互.你可以通过看the following blog post了解更多.

6、HTTP Streaming Directly To The OutputStream

ResponseBodyEmitter允许通过HttpMessageConverter把发送的events写到对象到response中.这可能是最常见的情况。例如写JSON数据.可是有时候它被用来绕开message转换直接写入到response的OutputStream。例如文件下载.这样可以通过返回StreamingResponseBody类型的值做到.

下面就是一个简单的例子:

@RequestMapping("/download")

public StreamingResponseBody handle() {

return new StreamingResponseBody() {

@Override

public void writeTo(OutputStream outputStream) throws IOException {

// write...

}

};

}123456789

注意:StreamingResponseBody同样可以用来作为ResponseEntity中的body用来定制化response的状态与headers。

7、配置异步请求

7.1 Servlet容器配置

保证web.xml中application的配置的版本是3.0:

web-app xmlns=""

xmlns:xsi=""

"

version="3.0"

...

/web-app123456789

可以通过web.xml中的子元素async-supportedtrue/async-supported使得DispatcherServlet支持异步.此外的任何Filter参与异步语法处理必须配置为支持ASYNC分派器类型。这样可以确保Spring Framework提供的所有filter都能够异步分发.自从它们继承了OncePerRequestFilter之后.并且在runtime的时候会check filter是否需要被异步调用分发.

下面是web.xml的配置示例:

web-app xmlns=""

xmlns:xsi=""

xsi:schemaLocation="

"

version="3.0"

filter

filter-nameSpring OpenEntityManagerInViewFilter/filter-name

filter-classorg.springframework.~.OpenEntityManagerInViewFilter/filter-class

async-supportedtrue/async-supported

/filter

filter-mapping

filter-nameSpring OpenEntityManagerInViewFilter/filter-name

url-pattern/*/url-pattern

dispatcherREQUEST/dispatcher

dispatcherASYNC/dispatcher

/filter-mapping

/web-app123456789101112131415161718192021

如果使用Sevlet3,Java配置可以通过WebApplicationInitializer,你同样需要像在web.xml中一样,设置”asyncSupported”标签为ASYNC.为了简化这个配置,考虑继承AbstractDispatcherServletInitializer或者AbstractAnnotationConfigDispatcherServletInitializer。它们会自动设置这些选项,使它很容易注册过滤器实例。

7.2. Spring MVC配置

Spring MVC提供Java Config与MVC namespace作为选择用来配置处理异步request.WebMvcConfigurer可以通过configureAsyncSupport来进行配置,而xml可以通过子元素来进行配置.

如果你不想依赖Servlet容器(e.g. Tomcat是10)配置的值,允许你配置异步请求默认的timeout值。你可以配置AsyncTaskExecutor用来包含Callable实例作为controller方法的返回值.强烈建议配置这个属性,因为在默认情况下Spring MVC使用SimpleAsyncTaskExecutor。Spring MVC中Java配置与namespace允许你注册CallableProcessingInterceptor与DeferredResultProcessingInterceptor实例.

如果你想覆盖DeferredResult的默认过期时间,你可以选择使用合适的构造器.同样的,对于Callable,你可以通过WebAsyncTask来包装它并且使用相应的构造器来定制化过期时间.WebAsyncTask的构造器同样允许你提供一个AsyncTaskExecutor.

因为水平有限,翻译不足之处还望见谅。

原文地址:spring-framework-reference-4.2.6.RELEASE

java web异步请求中,async什么意思

async 是 asynchronous 就是异步标签。spring3之后支持@Async注解的异步任务,和java web无关。java web中servlet3.0标准支持异步http请求处理。现在常用的web mvc框架中个Spring MVC 3.2 M1 引入支持servlet3.0。

以下是来自 Spring 官方博客的消息:

Spring MVC 3.2 M1 将引入对异步请求处理的支持,基于 Servlet 3.0 规范。尽管该版本还没发布,你可以在这里看到包含的改进。

简单预览一下:

一个控制器方法可通过返回 Callable 来完成异步处理:

@RequestMapping(method=RequestMethod.POST)

public CallableString processUpload(final MultipartFile file) {

return new CallableString() {

public Object call() throws Exception {

// ...

return "someView";

}

};

}

或者控制器方法返回 DeferredResult (new in Spring 3.2 M1) 来完成处理

@RequestMapping("/quotes")

@ResponseBody

public DeferredResult quotes() {

DeferredResult deferredResult = new DeferredResult();

// Add deferredResult to a Queue or a Map...

return deferredResult;

}

// In some other thread..

// Set the return value on the deferredResult

deferredResult.set(data);

script标签的async属性是用来异步加载,异步加载的作用是不是同时下载,执行html代码和js代码

一般的script标签(不带async等属性)加载时会阻塞浏览器,也就是说,浏览器在下载或执行该js代码块时,后面的标签不会被解析,例如在head中添加一个script,但这个script下载时网络不稳定,很长时间没有下载完成对应的js文件,那么浏览器此时一直等待这个js文件下载,此时页面不会被渲染,用户看到的就是白屏(网页文件已下载好,但浏览器不解析)

而使用async属性,浏览器会下载js文件,同时继续对后面的内容进行渲染

通常如果js不需要改变DOM结构时可以使用async进行异步加载(比如一些统计代码可以异步加载,因为此代码与页面执行逻辑无关,不会改变DOM结构)

Springboot 使用@Async开启异步调用

大家都知道,java是同步顺序执行。当需要异步执行时,需要新创建一个线程完成。

1. 使用常规的方法显示异步调用

第一步 新建 ThreadTest.java 实现 Runnable 接口

第二步 新建测试执行

当然,除了这种显式 new Thread 对象,我们通过线程池获取线程名称,这里不做演示。我们熟悉的spring 在 spring3中提供了@Async注解,来方便开发者优雅的使用异步调用。

2.使用 springboot @Async注解,优雅的实现异步调用

第一步 开启 异步调用注解。

第二步 定义线程池

第三步 创建service 测试类 TestService.java

第四步 新建 Service 实现类 ,TestServiceImpl.java

第五步 测试执行 ,执行结果

SpringBoot使用@Async优雅的异步调用就暂时记录到这里,欢迎评论区一起讨论学习。

Js延迟加载的方式有哪些?defer和async的区别是什么?

J s延迟加载的方式有哪些?

给javascript标签添加 defer和async属性。

defer和async的区别是什么?

1、defer和async都是使script异步加载的意思,当都没有设置这个属性的时候,html的加载会被阻塞等着script加载完成和执行完成后再渲染页面。

2、当设置了async时,异步加载,一旦加载完成则阻塞html渲染,进行执行,而且如果有多个script标签则谁先加载完,谁先执行。

3、当设置了defer时,异步加载,不会阻塞html,待html渲染完毕后再进行script执行。

注意:ie只支持defer

javaasync标签的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于spring async标签最佳实践、javaasync标签的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-18,除非注明,否则均为首码项目网原创文章,转载请注明出处。