昆山住房和城乡建设局网站建筑模型网站有哪些

当前位置: 首页 > news >正文

昆山住房和城乡建设局网站,建筑模型网站有哪些,沈阳专业制作网站公司吗,苏州吴江区住房和城乡建设局网站首先要明确一点#xff0c;同步请求和异步请求对于客户端用户来讲是一样的#xff0c;都是需客户端等待返回结果。不同之处在于请求到达服务器之后的处理方式#xff0c;下面用两张图解释一下同步请求和异步请求在服务端处理方式的不同#xff1a;同步请求异步请求两个流程…首先要明确一点同步请求和异步请求对于客户端用户来讲是一样的都是需客户端等待返回结果。不同之处在于请求到达服务器之后的处理方式下面用两张图解释一下同步请求和异步请求在服务端处理方式的不同同步请求异步请求两个流程中客户端对Web容器的请求都是同步的。因为它们在请求客户端时都处于阻塞等待状态并没有进行异步处理。在Web容器部分第一个流程采用同步请求第二个流程采用异步回调的形式。通过异步处理可以先释放容器分配给请求的线程与相关资源减轻系统负担从而增加了服务器对客户端请求的吞吐量。但并发请求量较大时通常会通过负载均衡的方案来解决而不是异步。使用AsyncContext执行异步请求package com.example.async;import java.io.IOException; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;RestController public class AsyncContextController {GetMapping(/asyncContext)ResponseBodypublic String asyncTask(HttpServletRequest request) {AsyncContext asyncContext request.startAsync();asyncContext.addListener(new AsyncListener() {Overridepublic void onTimeout(AsyncEvent event) throws IOException {System.out.println(处理超时了…);}Overridepublic void onStartAsync(AsyncEvent event) throws IOException {System.out.println(线程开始执行);}Overridepublic void onError(AsyncEvent event) throws IOException {System.out.println(执行过程中发生错误 event.getThrowable().getMessage());}Overridepublic void onComplete(AsyncEvent event) throws IOException {System.out.println(执行完成释放资源);}});asyncContext.setTimeout(6000);asyncContext.start(new Runnable() {Overridepublic void run() {try {Thread.sleep(5000);System.out.println(内部线程 Thread.currentThread().getName());asyncContext.getResponse().getWriter().println(async processing);} catch (Exception e) {System.out.println(异步处理发生异常 e.getMessage());}asyncContext.complete(); // 异步请求完成通知整个请求完成}});System.out.println(主线程 Thread.currentThread().getName()); return OK;} }使用Callable执行异步请求package com.example.async;import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;RestController public class CallableController {GetMapping(path /callable)ResponseBodypublic CallableString asyncRequest() {return () - {TimeUnit.SECONDS.sleep(10);return OK;};} }使用WebAsyncTask执行异步请求package com.example.async;import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.WebAsyncTask;RestController public class WebAsyncTaskController {GetMapping(/webAsyncTask)ResponseBodypublic WebAsyncTaskString asyncTask() {WebAsyncTaskString webAsyncTask new WebAsyncTaskString(1000l * 10, new CallableString() {Overridepublic String call() throws Exception {TimeUnit.SECONDS.sleep(5);return OK;}});webAsyncTask.onCompletion(new Runnable() {Overridepublic void run() {System.out.println(调用完成);}});webAsyncTask.onTimeout(new CallableString() {Overridepublic String call() throws Exception {return Time Out;}});return webAsyncTask;} } 使用DeferredResult执行异步请求package com.example.async;import java.util.concurrent.TimeUnit; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult;RestController public class DeferredResultController {GetMapping(path /deferredResult)ResponseBodypublic DeferredResultString asyncRequest() {DeferredResultString deferredResult new DeferredResult(1000L * 5, 失败);deferredResult.onTimeout(() - {System.out.println(调用超时);deferredResult.setResult(调用超时);});deferredResult.onCompletion(() - {System.out.println(调用完成);});new Thread(() - {try {TimeUnit.SECONDS.sleep(10);deferredResult.setResult(OK);} catch (Exception e) {e.printStackTrace();}}).start();return deferredResult;} }另外Spring Boot中使用注解Async处理异步任务Async注解的异步操作和上文所诉的四种异步请求不同之处在于使用Async处理异步任务时没有异步回调响应客户端的流程使用EnableAsync开启Asyncpackage com.example;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync;EnableAsync SpringBootApplication public class ExampleApplication {public static void main(String[] args) {SpringApplication.run(ExampleApplication.class, args);}}如果将Async加在Controller上或是 Controller 的方法上package com.example.async;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;RestController public class AsyncController {Autowiredprivate TestService testService;GetMapping(/async)ResponseBodyAsyncpublic String asyncTask() {testService.doSomeThing();System.out.println(处理完成);return OK;} }控制器立即会给客户端空响应但是控制器方法依旧执行如果将Async加在Service上或是 Service 的方法上package com.example.async;import java.util.concurrent.TimeUnit; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service;Service public class TestService {Asyncpublic void doSomeThing() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}} }控制器不再等待Service方法执行完毕就响应客户端