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

深圳网络营销推广服务免费建站优化

深圳网络营销推广服务,免费建站优化,传播易网站开发方案,个人网页制作教程文章目录 引子springboot的几种异步形式开启异步支持和线程池配置#xff08;重要#xff09;第一种#xff1a;Async第二种#xff1a;CallableT第三种#xff1a;WebAsyncTaskT第四种#xff1a;DeferredResultT 长轮询的简单实现概念实现服务… 文章目录 引子springboot的几种异步形式开启异步支持和线程池配置重要第一种Async第二种CallableT第三种WebAsyncTaskT第四种DeferredResultT 长轮询的简单实现概念实现服务端客户端 引子 在聊 springboot 的异步任务之前我们先要搞清楚一个最基础的概念什么是同步什么是异步 其实这个概念理解起来很简单假设有任务 A 和任务 B如果必须先完成 A再去做 B 则可称为同步。而如果在完成 A 的同时还可以同时去做 B两个事情互不影响则完成完成任务 B 的过程可称为异步执行。 springboot提供了四种异步方式。 第一种Async被标记了此注解的方法会被丢到异步线程中执行不会影响接口的返回。第二种接口返回 Callable类型。此类型对于调用方来说感知上还是同步的只是后台服务启用了一个异步线程执行而已。第三种接口返回WebAsyncTask类型此类型和返回Callable的逻辑大体相同也只是后台服务启用了一个异步线程执行而已。 但是多了一些使用的自由度比如自定义超时时间使用自定义线程池等下面会详细介绍。第四种接口返回DeferredResult类型有别于第一种不影响接口返回和第二、三种待任务执行完成后返回结果DeferredResult类型则可以将请求挂起可以通过其他线程设置返回值我们也会基于这个来实现长轮询。 springboot的几种异步形式 开启异步支持和线程池配置重要 首先开启异步支持EnableAsync如下 EnableAsync SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}其实对于Callable、WebAsyncTask和DeferredResult来说不开启此配置也可以用Async 不行必须开启才能用否则不生效。但是为什么推荐大家开启呢主要是因为线程池的原因在默认情况下Callable、WebAsyncTask都需要使用到线程池但是如果没有使用EnableAsync开启异步支持那么他们都是使用SimpleAsyncTaskExecutor轻看它的几句源码 protected void doExecute(Runnable task) {Thread thread (this.threadFactory ! null ? this.threadFactory.newThread(task) : createThread(task));thread.start(); }看到没随时使用随时创建用这玩意如果异步太多不把系统资源耗尽了所以不推荐大家用。而一旦使用EnableAsync开启异步支持那么就会默认创建一个线程池。大家可以这么配置这样就安全多了当然还可以通过代码配置这里就不具体说了只为了让大家知道有这么回事闲聊嘛不想太累而且网上一大把大家可以自己搜索 spring:task:execution:pool:core-size: 10这里主要配置一个核心线程数其他参数大家可以自己研究下无非就那几个这里只为告知其存在。当然生产环境大家都会按需配置所以大家还是配置一下最为稳妥。 EnableAsync开启异步支持后默认情况下Async、Callable、WebAsyncTask都使用上面配置的线程池。后续就不再介绍了。 第一种Async 此种类型的异步更多是在主线程完成了主要任务之后将一些剩余工作比如记录日志或者通知其他系统的工作交由异步线程来完成。可以如下方式实现此时调用接口会立马返回 finish在 10 秒后后台会打印“异步执行完毕” GetMapping(/test-async) public String testAsync(){asyncService.async();return finish; }Service public class AsyncService {Asyncpublic void async() {try {Thread.sleep(10000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(异步执行完毕);} }第二种Callable 此种类型的存在主要是为了提升系统的并发能力。我们知道每一个请求 servlet容器比如 tomcat 都会为其分配一个处理线程但这个线程是有数量限制的一旦被用完就会限制系统其他请求的接入。所以通过将请求放到其他线程池中处理的方式来提升系统的并发能力。例如 GetMapping(test-callable) public CallableString testCallable(){CallableString callable new CallableString() {Overridepublic String call() throws Exception {log.info(任务开始callable);Thread.sleep(10000);log.info(任务完成callable);return 任务执行完成;}};return callable; }最后接口会返回任务执行完成 第三种WebAsyncTask 此类型和Callable异曲同工只是更加灵活所以推荐大家使用WebAsyncTask。 GetMapping(test-webasynctask)public WebAsyncTaskString testWebAsyncTask() {WebAsyncTaskString webAsyncTask new WebAsyncTask(20000, new CallableString() {Overridepublic String call() throws Exception {log.info(任务开始webasynctask);Thread.sleep(10000);log.info(任务完成webasynctask);return 任务执行完成;}});webAsyncTask.onError(null);webAsyncTask.onCompletion(null);webAsyncTask.onTimeout(null);return webAsyncTask;}看到没有好多回调还支持超时机制更加灵活再看下WebAsyncTask的构造函数 public WebAsyncTask(CallableV callable); public WebAsyncTask(long timeout, CallableV callable); public WebAsyncTask(Nullable Long timeout, String executorName, CallableV callable); public WebAsyncTask(Nullable Long timeout, AsyncTaskExecutor executor, CallableV callable);我们发现它还支持传入线程池是不是很灵活 第四种DeferredResult 此类型同样是会将请求挂起待合适的时机再返回什么是合适的时机我们先来看一个例子。 GetMapping(test-deferredResult) public DeferredResultString testDeferredResult(){DeferredResultString deferredResult new DeferredResult();asyncService.setDeferredResult(deferredResult);return deferredResult; }Async public void setDeferredResult(DeferredResultString deferredResult) {try {log.info(任务开始);Thread.sleep(10000);//设置返回deferredResult.setResult(DeferredResult执行成功啦);log.info(任务完成);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(异步执行完毕); }我们看到在异步线程中通过deferredResult.setResult(T)的方法即可让接口返回这里我们是借用了Async 方法其实这个异步线程可以是任意的其他线程或者其他请求触发。即只要有一个地方通过deferredResult.setResult(T)设置了返回即可是不是很酷 同样我们再来看看它的其他方法首先是构造函数比较简单就不详细描述了 public DeferredResult(); public DeferredResult(Long timeoutValue); public DeferredResult(Nullable Long timeoutValue, Object timeoutResult); public DeferredResult(Nullable Long timeoutValue, Supplier? timeoutResult)再看其他方法 //是否已经过期或者设置过了结果 boolean setOrExpired deferredResult.isSetOrExpired(); //获取已经设置的结果 Object result deferredResult.getResult(); //是否已经设置了结果 boolean hasResult deferredResult.hasResult(); //这个的 ErrorResult可以是Exception或者Throwable会当做异常被抛出 deferredResult.setErrorResult(null); //会对 Result 进一步处理 deferredResult.setResultHandler(null); //完成回调 deferredResult.onCompletion(); //错误回调 deferredResult.onError(); //超时回调 deferredResult.onTimeout();长轮询的简单实现 概念 这里简单介绍一下概念所谓长轮询其实是一种实时通信技术。即当客户端连接到服务器时服务器不会立马返回而是将请求挂起当有数据某事件发生或者数据发生变更时再返回这样就达到了实时通信的效果。当然一般客户端和服务端都会有超时时间的存在当请求超时时客户端再次发起请求来保持连接。 实现 这里我们基于DeferredResult来实现一个简单的长轮询。这里举一个例子客户端监控是否有配置变更。如下 服务端 这里客户端通过请求test-detect-config-refresh来监听配置变化而test-set-config接口则用于更新配置。当配置更新时会响应所有的客户端的请求达到更新配置的目的 ListDeferredResultString deferredResults new ArrayList();GetMapping(test-detect-config-refresh) public DeferredResultString testDetectConfigRefresh() {DeferredResultString deferredResult new DeferredResult(10000L);deferredResult.onTimeout(() - {deferredResults.remove(deferredResult);deferredResult.setResult(empty);});deferredResults.add(deferredResult);return deferredResult; }GetMapping(test-set-config) public String testDetectConfigRefresh(String config) {for (DeferredResultString deferredResult : deferredResults) {if (deferredResult.isSetOrExpired()) {continue;}deferredResult.setResult(config);}deferredResults.clear();return success; }客户端 注意客户端的超时时间要大于服务器的超时时间不然客户端先超时服务器端还咋返回呢对吧 while(true){String result request(test-detect-config-refresh,20000);if (empty.equals(result)) {//空返回再次发起不做任何处理} else {//更新配置updateConfig(result);} }private String request(String url, long timeout){//实现请求 }private void updateConfig(String config){//实现更新配置 }是不是很简单当然这里只是介绍存在一些问题比如如果恰好配置更新时客户端超时断开了怎么办实际生产还是需要更为完备的设计这里就不过多介绍了大家可以自行思考
http://www.zqtcl.cn/news/195262/

相关文章:

  • 网站建设微信运营销售做网站用啥语言
  • dw建设网站步骤活动汪活动策划网站
  • 民和县公司网站建设网站开发的特点
  • 模板企业快速建站上传网站中ftp地址写什么
  • 云南本地企业做网站太原网站制作公司哪家好
  • 西部数码域名网站模板wordpress抓取股票行情
  • 丰台深圳网站建设公司关于服装店网站建设的策划方案
  • win7 iis网站无法显示随州网站建设哪家实惠
  • 利用网站新媒体宣传法治建设建站哪个平台好
  • 网站seo课设wordpress 500 根目录
  • 电子商务网站建设的阶段化分析如何利用视频网站做数字营销推广
  • 电子商务网站建设ppt模板国外注册机网站
  • 西部数码做跳转网站百度seo排名培训优化
  • 农业网站素材wordpress all in one
  • 学习网站建设有前景没wordpress 和dokuwiki
  • 服装网站开发方案网站设计美工排版编辑
  • 旅游网站首页模板下载广州市建设工程检测中心网站
  • 餐饮加盟网站建设wordpress 首行缩进
  • kkday是哪里做的网站橙云 php网站建设
  • 站长之家0网站规划作品
  • 物流公司网站建设系统规划广告设计怎么学
  • 异地备案 网站中信建设有限责任公司经济性质
  • 网站没有备案怎么申请广告宿迁莱布拉网站建设
  • 太原适合网站设计地址网站建设 教学视频教程
  • 建商城网站需要多少钱网站开发维护报价单
  • 唐山网站建设冀icp备婚纱网站页面设计
  • 做购物网站支付需要怎么做手机网站建设教程
  • 国外网站空间租用哪个好建站快车打电话
  • 自媒体网站 程序做药公司的网站前置审批
  • 简洁网站模板素材廊坊建设企业网站