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

政务服务中心网站建设实施方案做最好的网站

政务服务中心网站建设实施方案,做最好的网站,客户资源网,门户网站建设方案ppt 百度文库1.简介 Servlet 3.0中引入的异步支持提供了在另一个线程中处理HTTP请求的可能性。 当您有一个长期运行的任务时#xff0c;这特别有趣#xff0c;因为当另一个线程处理此请求时#xff0c;容器线程将被释放并可以继续处理其他请求。 关于这个主题的解释已经很多次了#x… 1.简介 Servlet 3.0中引入的异步支持提供了在另一个线程中处理HTTP请求的可能性。 当您有一个长期运行的任务时这特别有趣因为当另一个线程处理此请求时容器线程将被释放并可以继续处理其他请求。 关于这个主题的解释已经很多次了但是对于Spring框架提供的利用该功能的类似乎有些困惑。 我说的是从Controller返回Callable和DeferredResult。 在本文中我将实现两个示例以显示其差异。 此处显示的所有示例均包含实现一个控制器该控制器将执行长时间运行的任务然后将结果返回给客户端。 长时间运行的任务由TaskService处理 Service public class TaskServiceImpl implements TaskService {private final Logger logger LoggerFactory.getLogger(this.getClass());Overridepublic String execute() {try {Thread.sleep(5000);logger.info(Slow task executed);return Task finished;} catch (InterruptedException e) {throw new RuntimeException();}} } 该Web应用程序是使用Spring Boot构建的。 我们将执行以下类来运行示例 SpringBootApplication public class MainApp {public static void main(String[] args) {SpringApplication.run(MainApp.class, args);} } 所有这些示例的源代码都可以在Github Spring-Rest仓库中找到 。 2.从阻塞控制器开始 在此示例中请求到达控制器。 只有执行了长时间运行的方法并且退出RequestMapping带注释的方法该servlet线程才会被释放。 RestController public class BlockingController {private final Logger logger LoggerFactory.getLogger(this.getClass());private final TaskService taskService;Autowiredpublic BlockingController(TaskService taskService) {this.taskService taskService;}RequestMapping(value /block, method RequestMethod.GET, produces text/html)public String executeSlowTask() {logger.info(Request received);String result taskService.execute();logger.info(Servlet thread released);return result;} } 如果我们在http// localhost8080 / block上运行此示例查看日志可以看到直到处理了长时间运行的任务5秒后后才释放servlet请求 2015-07-12 12:41:11.849 [nio-8080-exec-6] x.s.web.controller.BlockingController : Request received 2015-07-12 12:41:16.851 [nio-8080-exec-6] x.spring.web.service.TaskServiceImpl : Slow task executed 2015-07-12 12:41:16.851 [nio-8080-exec-6] x.s.web.controller.BlockingController : Servlet thread released3.返回可致电 在此示例中我们将直接返回Callable而不是直接返回结果 RestController public class AsyncCallableController {private final Logger logger LoggerFactory.getLogger(this.getClass());private final TaskService taskService;Autowiredpublic AsyncCallableController(TaskService taskService) {this.taskService taskService;}RequestMapping(value /callable, method RequestMethod.GET, produces text/html)public CallableString executeSlowTask() {logger.info(Request received);CallableString callable taskService::execute;logger.info(Servlet thread released);return callable;} } 返回Callable意味着Spring MVC将在另一个线程中调用Callable中定义的任务。 Spring将使用TaskExecutor管理该线程。 在等待长任务完成之前将释放servlet线程。 让我们看一下日志 2015-07-12 13:07:07.012 [nio-8080-exec-5] x.s.w.c.AsyncCallableController : Request received 2015-07-12 13:07:07.013 [nio-8080-exec-5] x.s.w.c.AsyncCallableController : Servlet thread released 2015-07-12 13:07:12.014 [ MvcAsync2] x.spring.web.service.TaskServiceImpl : Slow task executed 您可以看到在长时间运行的任务完成执行之前我们已经从servlet返回。 这并不意味着客户已收到响应。 与客户端的通信仍处于打开状态等待结果但是接收到该请求的线程已经释放并且可以服务于另一个客户端的请求。 4.返回DeferredResult 首先我们需要创建一个DeferredResult对象。 该对象将由控制器返回。 我们将完成的工作与Callable相同即在我们在另一个线程中处理长时间运行的任务时释放Servlet线程。 RestController public class AsyncDeferredController {private final Logger logger LoggerFactory.getLogger(this.getClass());private final TaskService taskService;Autowiredpublic AsyncDeferredController(TaskService taskService) {this.taskService taskService;}RequestMapping(value /deferred, method RequestMethod.GET, produces text/html)public DeferredResultString executeSlowTask() {logger.info(Request received);DeferredResultString deferredResult new DeferredResult();CompletableFuture.supplyAsync(taskService::execute).whenCompleteAsync((result, throwable) - deferredResult.setResult(result));logger.info(Servlet thread released);return deferredResult;} 那么与Callable有什么区别 所不同的是这次线程是由我们管理的。 在不同的线程中设置DeferredResult的结果是我们的责任。 在此示例中我们要做的是使用CompletableFuture创建一个异步任务。 这将创建一个新线程将在其中执行长时间运行的任务。 在此线程中我们将设置结果。 我们从哪个池中检索这个新线程 默认情况下CompletableFuture中的supplyAsync方法将在ForkJoin池中运行任务。 如果要使用其他线程池可以将执行程序传递给supplyAsync方法 public static U CompletableFutureU supplyAsync(SupplierU supplier, Executor executor) 如果运行此示例我们将得到与Callable相同的结果 2015-07-12 13:28:08.433 [io-8080-exec-10] x.s.w.c.AsyncDeferredController : Request received 2015-07-12 13:28:08.475 [io-8080-exec-10] x.s.w.c.AsyncDeferredController : Servlet thread released 2015-07-12 13:28:13.469 [onPool-worker-1] x.spring.web.service.TaskServiceImpl : Slow task executed5.结论 从高层次来看Callable和DeferredResult做同样的事情即释放容器线程并在另一个线程中异步处理长时间运行的任务。 区别在于谁管理执行任务的线程。 我正在Google Plus和Twitter上发布我的新帖子。 如果您要更新新内容请关注我。 翻译自: https://www.javacodegeeks.com/2015/07/understanding-callable-and-spring-deferredresult.html
http://www.zqtcl.cn/news/34492/

相关文章:

  • 江苏外贸网站建设推广山东公司网页定制
  • seo对于电子商务网站推广的作用发布的手机网站是乱码
  • 昆明驿站网站建设phpmysql旅游网站开发
  • 网站制作学校要的做网站发布网
  • 网站风格对比信息表西安的商城网站设计
  • 模具培训网站建设网站设计 图片
  • 婚纱摄影网站seo方案网站文章推广
  • 宣传网站模板网站的弹窗怎么做
  • 帝国cms仿站工具wordpress本地访问速度慢
  • 网站被挂广告怎么办自助网站免费
  • 杭州做卖房子的工作哪个网站好中建一局集团有限公司官网
  • 中山做网站优化被黑网站查询
  • 武昌网站建设制作wordpress秀恩爱主题
  • 网站内容由什么组成部分软件培训机构排名
  • 品牌建设三年行动方案重庆网站seo费用
  • 网站维护总结人力外包项目外包
  • 可以专做福特配件吗外贸网站黑帽seo软件
  • 专业做鞋子的网站吗建立容错纠错机制
  • 腾讯风铃网站建设网站 三合一
  • 深圳网站建设 利科技有限公司上海十大室内设计公司排名
  • 青羊区网站建设制作网站公司首 荐乐云seo
  • 央企网站建设页面跳转页面紧急通知
  • 如何给网站做轮播图浙江建设继续教育网站首页
  • 网站建设上机课wordpress报价
  • 网站建设需要审批吗桂林网站网站建设
  • 海外设计网站建设摄影师个人网站模板
  • 南通门户网站建设方案哪些公司做网站维护的
  • dede做电影网站杨浦集团网站建设
  • 浅谈博星卓越网站建设竞价托管哪家公司好
  • 重庆黔江做防溺水的网站外贸seo网站搭建