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

淘宝客户自己做网站怎么做镇江关键字优化公司

淘宝客户自己做网站怎么做,镇江关键字优化公司,深圳免费网站建设,网站建设一般要提供什么内容作者 | 会炼钢的小白龙来源 | cnblogs.com/baixianlong/p/10661591.html一、SpringBoot中异步请求的使用1、异步请求与同步请求 特点#xff1a;可以先释放容器分配给请求的线程与相关资源#xff0c;减轻系统负担#xff0c;释放了容器所分配线程的请求#xff0c;其响应将… 作者 | 会炼钢的小白龙来源 | cnblogs.com/baixianlong/p/10661591.html一、SpringBoot中异步请求的使用1、异步请求与同步请求 特点可以先释放容器分配给请求的线程与相关资源减轻系统负担释放了容器所分配线程的请求其响应将被延后可以在耗时处理完成例如长时间的运算时再对客户端进行响应。一句话增加了服务器对客户端请求的吞吐量实际生产上我们用的比较少如果并发请求量很大的情况下我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力当然还可以通过消息队列来做请求的缓冲。2、异步请求的实现 方式一Servlet方式实现异步请求 RequestMapping(value /email/servletReq, method GET)public void servletReq (HttpServletRequest request, HttpServletResponse response) {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());}Overridepublic void onComplete(AsyncEvent event) throws IOException {System.out.println(执行完成);//这里可以做一些清理资源的操作...}});//设置超时时间asyncContext.setTimeout(20000);asyncContext.start(new Runnable() {Overridepublic void run() {try {Thread.sleep(10000);System.out.println(内部线程 Thread.currentThread().getName());asyncContext.getResponse().setCharacterEncoding(utf-8);asyncContext.getResponse().setContentType(text/html;charsetUTF-8);asyncContext.getResponse().getWriter().println(这是异步的请求返回);} catch (Exception e) {System.out.println(异常e);}//异步请求完成通知//此时整个请求才完成asyncContext.complete();}});//此时之类 request的线程连接已经释放了System.out.println(主线程 Thread.currentThread().getName());} 方式二使用很简单直接返回的参数包裹一层callable即可可以继承WebMvcConfigurerAdapter类来设置默认线程池和超时处理 RequestMapping(value /email/callableReq, method GET)ResponseBodypublic CallableString callableReq () {System.out.println(外部线程 Thread.currentThread().getName());return new CallableString() {Overridepublic String call() throws Exception {Thread.sleep(10000);System.out.println(内部线程 Thread.currentThread().getName());return callable!;}};}Configurationpublic class RequestAsyncPoolConfig extends WebMvcConfigurerAdapter {Resourceprivate ThreadPoolTaskExecutor myThreadPoolTaskExecutor;Overridepublic void configureAsyncSupport(final AsyncSupportConfigurer configurer) {//处理 callable超时configurer.setDefaultTimeout(60*1000);configurer.setTaskExecutor(myThreadPoolTaskExecutor);configurer.registerCallableInterceptors(timeoutCallableProcessingInterceptor());}Beanpublic TimeoutCallableProcessingInterceptor timeoutCallableProcessingInterceptor() {return new TimeoutCallableProcessingInterceptor();} } 方式三和方式二差不多在Callable外包一层给WebAsyncTask设置一个超时回调即可实现超时处理 RequestMapping(value /email/webAsyncReq, method GET)ResponseBodypublic WebAsyncTaskString webAsyncReq () {System.out.println(外部线程 Thread.currentThread().getName());CallableString result () - {System.out.println(内部线程开始 Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {// TODO: handle exception}logger.info(副线程返回);System.out.println(内部线程返回 Thread.currentThread().getName());return success;};WebAsyncTaskString wat new WebAsyncTaskString(3000L, result);wat.onTimeout(new CallableString() {Overridepublic String call() throws Exception {// TODO Auto-generated method stubreturn 超时;}});return wat;} 方式四DeferredResult可以处理一些相对复杂一些的业务逻辑最主要还是可以在另一个线程里面进行业务处理及返回即可在两个完全不相干的线程间的通信。RequestMapping(value /email/deferredResultReq, method GET)ResponseBodypublic DeferredResultString deferredResultReq () {System.out.println(外部线程 Thread.currentThread().getName());//设置超时时间DeferredResultString result new DeferredResultString(60*1000L);//处理超时事件 采用委托机制result.onTimeout(new Runnable() {Overridepublic void run() {System.out.println(DeferredResult超时);result.setResult(超时了!);}});result.onCompletion(new Runnable() {Overridepublic void run() {//完成后System.out.println(调用完成);}});myThreadPoolTaskExecutor.execute(new Runnable() {Overridepublic void run() {//处理业务逻辑System.out.println(内部线程 Thread.currentThread().getName());//返回结果result.setResult(DeferredResult!!);}});return result;} 二、SpringBoot中异步调用的使用1、介绍 异步请求的处理。除了异步请求一般上我们用的比较多的应该是异步调用。通常在开发过程中会遇到一个方法是和实际业务无关的没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理让主线程异步的执行其他业务。2、使用方式基于spring下 需要在启动类加入EnableAsync使异步调用Async注解生效在需要异步执行的方法上加入此注解即可Async(threadPool),threadPool为自定义线程池代码略。。。就俩标签自己试一把就可以了3、注意事项 在默认情况下未设置TaskExecutor时默认是使用SimpleAsyncTaskExecutor这个线程池但此线程不是真正意义上的线程池因为线程不重用每次调用都会创建一个新的线程。可通过控制台日志输出可以看出每次输出线程名都是递增的。所以最好我们来自定义一个线程池。调用的异步方法不能为同一个类的方法包括同一个类的内部类简单来说因为Spring在启动扫描时会为其创建一个代理类而同类调用时还是调用本身的代理类的所以和平常调用是一样的。其他的注解如Cache等也是一样的道理说白了就是Spring的代理机制造成的。所以在开发中最好把异步服务单独抽出一个类来管理。下面会重点讲述。4、什么情况下会导致Async异步方法会失效 a.调用同一个类下注有Async异步方法在spring中像Async和Transactional、cache等注解本质使用的是动态代理其实Spring容器在初始化的时候Spring容器会将含有AOP注解的类对象“替换”为代理对象简单这么理解那么注解失效的原因就很明显了就是因为调用方法的是对象本身而不是代理对象因为没有经过Spring容器那么解决方法也会沿着这个思路来解决。b.调用的是静态(static )方法c.调用(private)私有化方法5、解决4中问题1的方式其它2,3两个问题自己注意下就可以了 将要异步执行的方法单独抽取成一个类原理就是当你把执行异步的方法单独抽取成一个类的时候这个类肯定是被Spring管理的其他Spring组件需要调用的时候肯定会注入进去这时候实际上注入进去的就是代理类了。其实我们的注入对象都是从Spring容器中给当前Spring组件进行成员变量的赋值由于某些类使用了AOP注解那么实际上在Spring容器中实际存在的是它的代理对象。那么我们就可以通过上下文获取自己的代理对象调用异步方法。Controller RequestMapping(/app) public class EmailController {//获取ApplicationContext对象方式有多种,这种最简单,其它的大家自行了解一下Autowiredprivate ApplicationContext applicationContext;RequestMapping(value /email/asyncCall, method GET)ResponseBodypublic MapString, Object asyncCall () {MapString, Object resMap new HashMapString, Object();try{//这样调用同类下的异步方法是不起作用的//this.testAsyncTask();//通过上下文获取自己的代理对象调用异步方法EmailController emailController (EmailController)applicationContext.getBean(EmailController.class);emailController.testAsyncTask();resMap.put(code,200);}catch (Exception e) {resMap.put(code,400);logger.error(error!,e);}return resMap;}//注意一定是public,且是非static方法Asyncpublic void testAsyncTask() throws InterruptedException {Thread.sleep(10000);System.out.println(异步任务执行完成);}} 6、开启cglib代理手动获取Spring代理类,从而调用同类下的异步方法。 首先在启动类上加上EnableAspectJAutoProxy(exposeProxy true)注解。代码实现如下Service Transactional(value transactionManager, readOnly false, propagation Propagation.REQUIRED, rollbackFor Throwable.class) public class EmailService {Autowiredprivate ApplicationContext applicationContext;Asyncpublic void testSyncTask() throws InterruptedException {Thread.sleep(10000);System.out.println(异步任务执行完成);}public void asyncCallTwo() throws InterruptedException {//this.testSyncTask(); // EmailService emailService (EmailService)applicationContext.getBean(EmailService.class); // emailService.testSyncTask();boolean isAop AopUtils.isAopProxy(EmailController.class);//是否是代理对象boolean isCglib AopUtils.isCglibProxy(EmailController.class); //是否是CGLIB方式的代理对象boolean isJdk AopUtils.isJdkDynamicProxy(EmailController.class); //是否是JDK动态代理方式的代理对象//以下才是重点!!!EmailService emailService (EmailService)applicationContext.getBean(EmailService.class);EmailService proxy (EmailService) AopContext.currentProxy();System.out.println(emailService proxy ? true : false);proxy.testSyncTask();System.out.println(end!!!);} } 三、异步请求与异步调用的区别两者的使用场景不同异步请求用来解决并发请求对服务器造成的压力从而提高对请求的吞吐量而异步调用是用来做一些非主线流程且不需要实时计算和响应的任务比如同步日志到kafka中做日志分析等。异步请求是会一直等待response相应的需要返回结果给客户端的而异步调用我们往往会马上返回给客户端响应完成这次整个的请求至于异步调用的任务后台自己慢慢跑就行客户端不会关心。【END】近期热文 面试珍藏最常见的200多道Java面试题被一个熟悉的面试题问懵了String...面试官如何实现幂等性校验年终盘点 | 2019年Java面试题汇总篇(附答案)关注下方二维码订阅更多精彩内容朕已阅
http://www.pierceye.com/news/489649/

相关文章:

  • 中小企业服务中心网站建设网站域名中文后缀
  • 龙武工会网站怎么做5173游戏交易网站源码
  • 网站建设设计时代创信好海南城乡和住房建设厅网站
  • 大连最好的做网站的公司崇义做网站
  • 圣弘建设股份有限公司网站上海图文设计有限公司
  • gta5资产网站正在建设零基础自学设计
  • 深圳专业制作网站公司吗网站信息化建设报送
  • 苏州网站建设运营推广网站一年多少钱?
  • WordPress国外主机湖北短视频seo营销
  • 南通网站建设电话设计一个网站要多少钱
  • 好的模板网站建设网站规划 时间
  • 昆明seocn整站优化网站建设如何报价
  • 网页设计模板免费网站WordPress生成网站地图
  • 做网站 侵权做外贸怎么看外国网站
  • 网站建设知识点的总结普通网站建设是什么
  • 杭州网站建设费用多少合肥高新城建设计院网站
  • 炫酷特效网站asa8.4 做网站映射
  • 郑州租赁房网站建设九江快乐城
  • 手机网站建站教育模板微信网站 教程
  • 网站的结构犀牛云做网站多少钱
  • 网站服务器用什么配置公司网站建设的视频教程
  • idea做网站网络营销与网站推广的区别
  • 建一家网站多少钱微信小程序在哪里查找
  • 东阳网站推广英文网站源码下载
  • 介绍湛江网站高端网站建设网站定制
  • 网站的特征包括哪些方面wordpress缓存插件 w3
  • 东莞专业网站营销wordpress新建页面模板
  • 做外贸学习网站智慧团建网页电脑版登录网站
  • 如何免费做一个网站攻略常州网站推广软件
  • 手机网站建站 服务器网站名称收录