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

广东的一起做网站金城武重庆森林经典台词

广东的一起做网站,金城武重庆森林经典台词,广州网站建设优化方案,牛牛襄阳网站建设Java大联盟帮助万千Java学习者持续成长关注作者#xff5c;Musclehengblog.csdn.net/Muscleheng/article/details/81409672前言最近在做订单模块#xff0c;用户购买服务类产品之后#xff0c;需要进行预约#xff0c;预约成功之后分别给商家和用户发送提醒短信。考虑发短信…   Java大联盟  帮助万千Java学习者持续成长关注作者Musclehengblog.csdn.net/Muscleheng/article/details/81409672前言最近在做订单模块用户购买服务类产品之后需要进行预约预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行于是就在网上看见了Spring的Async了。但是遇到了许多问题使得Async无效也一直没有找到很好的文章去详细的说明Async的正确及错误的使用方法及需要注意的地方这里简单整理了一下遇见的问题Sring是以配置文件的形式来开启Async而SpringBoot则是以注解的方式开启。我们可以使用springBoot默认的线程池不过一般我们会自定义线程池(因为比较灵活)配置方式有使用 xml 文件配置的方式使用Java代码结合Configuration进行配置(推荐使用)下面分别实现两种配置方式第一步、配置Async一、springBoot启动类的配置在Spring Boot的主程序中配置EnableAsync如下所示ServletComponentScanSpringBootApplicationEnableAsyncpublic class ClubApiApplication {    public static void main(String[] args) {        SpringApplication.run(ClubApiApplication.class, args);    }}二、Spring XML的配置方式1.applicationContext.xml同目录下创建文件threadPool.xml文件?xml  version1.0 encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:taskhttp://www.springframework.org/schema/taskxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd                        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd        task:annotation-driven executorthreadPool /        bean idthreadPoolclassorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor                property namecorePoolSize value10 /                property namemaxPoolSize value50 /                property namequeueCapacity value100 /                property namekeepAliveSeconds value30 /                property namewaitForTasksToCompleteOnShutdown valuetrue /                property nameallowCoreThreadTimeOut valuetrue /                property namerejectedExecutionHandler                                                            bean classjava.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy /        property    beanbeans2.然后在applicationContext.xml中引入threadPool.xmlimport resourcethreadPool.xml /task:annotation-driven executorWhifExecutor /第二步创建两个异步方法的类如下所示:第一个类(这里模拟取消订单后发短信有两个发送短信的方法)Servicepublic class TranTest2Service {    // 发送提醒短信 1    Async    public void sendMessage1() throws InterruptedException {        System.out.println(发送短信方法---- 1   执行开始);        Thread.sleep(5000); // 模拟耗时        System.out.println(发送短信方法---- 1   执行结束);    }    // 发送提醒短信 2    Async    public void sendMessage2() throws InterruptedException {        System.out.println(发送短信方法---- 2   执行开始);        Thread.sleep(2000); // 模拟耗时        System.out.println(发送短信方法---- 2   执行结束);    }}第二个类。调用发短信的方法 (异步方法不能与被调用的异步方法在同一个类中否则无效)Servicepublic class OrderTaskServic {    Autowired    private TranTest2Service tranTest2Service;    // 订单处理任务    public void orderTask() throws InterruptedException {        this.cancelOrder(); // 取消订单        tranTest2Service.sendMessage1(); // 发短信的方法   1        tranTest2Service.sendMessage2(); // 发短信的方法  2    }    // 取消订单    public void cancelOrder() throws InterruptedException {        System.out.println(取消订单的方法执行------开始);        System.out.println(取消订单的方法执行------结束 );    }}经过测试得到如下结果1.没有使用Async2.使用了Async可以看出没有使用Async方式实现的发送短信是同步执行的意思就是说第一条发送之后再发送第二条第二条发送成功之后再给用户提示这样显然会影响用户体验再看使用了Async实现的在执行第一个发送短信方法之后马上开启另一个线程执行第二个方法显然这样我们的处理速度回快很多。使用Java代码结合Configuration注解的配置方式(推荐使用)1. 新建一个配置类package com.boot.common.conf;import java.util.concurrent.ThreadPoolExecutor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;/** * 线程池配置 * author zhh * */ConfigurationEnableAsyncpublic class ThreadPoolTaskConfig {/**  *   默认情况下在创建了线程池后线程池中的线程数为0当有任务来之后就会创建一个线程去执行任务 *    当线程池中的线程数目达到corePoolSize后就会把到达的任务放到缓存队列当中 *  当队列满了就继续创建线程当线程数量大于等于maxPoolSize后开始使用拒绝策略拒绝  */    /** 核心线程数(默认线程数) */    private static final int corePoolSize  20;    /** 最大线程数 */    private static final int maxPoolSize  100;    /** 允许线程空闲时间(单位默认为秒) */    private static final int keepAliveTime  10;    /** 缓冲队列大小 */    private static final int queueCapacity  200;    /** 线程池名前缀 */    private static final String threadNamePrefix  Async-Service-;    Bean(taskExecutor) // bean的名称默认为首字母小写的方法名    public ThreadPoolTaskExecutor taskExecutor(){        ThreadPoolTaskExecutor executor  new ThreadPoolTaskExecutor();        executor.setCorePoolSize(corePoolSize);           executor.setMaxPoolSize(maxPoolSize);        executor.setQueueCapacity(queueCapacity);        executor.setKeepAliveSeconds(keepAliveTime);        executor.setThreadNamePrefix(threadNamePrefix);        // 线程池对拒绝任务的处理策略        // CallerRunsPolicy由调用线程(提交任务的线程)处理该任务        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        // 初始化        executor.initialize();        return executor;    }}2.创建两个异步方法的类(和之前的类类似仅仅是方法上注解不一样)如下所示:第一个类(这里模拟取消订单后发短信有两个发送短信的方法)package com.boot.test1.service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;Servicepublic class TranTest2Service {    Logger log  LoggerFactory.getLogger(TranTest2Service.class);    // 发送提醒短信 1        PostConstruct // 加上该注解项目启动时就执行一次该方法    Async(taskExecutor)    public void sendMessage1() throws InterruptedException {        log.info(发送短信方法---- 1   执行开始);        Thread.sleep(5000); // 模拟耗时        log.info(发送短信方法---- 1   执行结束);    }    // 发送提醒短信 2        PostConstruct // 加上该注解项目启动时就执行一次该方法    Async(taskExecutor)    public void sendMessage2() throws InterruptedException {        log.info(发送短信方法---- 2   执行开始);        Thread.sleep(2000); // 模拟耗时        log.info(发送短信方法---- 2   执行结束);    }}代码中的 Async(taskExecutor) 对应我们自定义线程池中的 Bean(taskExecutor) 表示使用我们自定义的线程池。第二个类。调用发短信的方法 (异步方法不能与被调用的异步方法在同一个类中否则无效)Servicepublic class OrderTaskServic {    Autowired    private TranTest2Service tranTest2Service;    // 订单处理任务    public void orderTask() throws InterruptedException {        this.cancelOrder(); // 取消订单        tranTest2Service.sendMessage1(); // 发短信的方法   1        tranTest2Service.sendMessage2(); // 发短信的方法  2    }    // 取消订单    public void cancelOrder() throws InterruptedException {        System.out.println(取消订单的方法执行------开始);        System.out.println(取消订单的方法执行------结束 );    }}运行截图注意看截图中的 [nio-8090-exec-1] 是Tomcat的线程名称[Async-Service-1]、[Async-Service-2]表示线程1和线程2 是我们自定义的线程池里面的线程名称我们在配置类里面定义的线程池前缀private static final String threadNamePrefix Async-Service-; // 线程池名前缀说明我们自定义的线程池被使用了。注意事项如下方式会使Async失效异步方法使用static修饰异步类没有使用Component注解(或其他注解)导致spring无法扫描到异步类异步方法不能与被调用的异步方法在同一个类中类中需要使用Autowired或Resource等注解自动注入不能自己手动new对象如果使用SpringBoot框架必须在启动类中增加EnableAsync注解推荐阅读1、B站原创2020版前后端分离视频教程2、Spring Boot源码解析3、一文搞懂前后端分离4、快速上手Spring BootVue前后端分离楠哥简介资深 Java 工程师微信号 nnsouthwind《Java零基础实战》一书作者今日头条认证大VGitChat认证作者B站认证UP主(楠哥教你学Java)致力于帮助万千 Java 学习者持续成长。有收获就点个在看
http://www.sadfv.cn/news/349404/

相关文章:

  • 电子购物网站设计好网站
  • wordpress本地化小程序排名优化
  • seo刷网站沧州南皮网站建设
  • 怎么利用网站上的图片什么网站可以发布广告
  • 网站制作怎样盈利wordpress图片并列排
  • 南昌网站免费制作网站建设方向论文提纲
  • python做网站感觉好费劲广告片制作
  • 无锡百度快速优化排名搜索引擎优化的基本手段
  • 溧水城乡建设局网站全新微信号2元一个自动下单
  • 阿里云域名怎么做网站宁夏网络推广公司
  • 客户都不愿意做网站专做水果的社区网站
  • 昆明移动端网站建设徐州市建设工程招标网
  • 电子商务网站建设运营营销型企业网站建设与推广
  • 苏州国内网站建设公司浙江省建设会计协会网站
  • 海外推广网站安徽六安特产有哪些
  • 免费1级做爰片动漫在线观看网站四川建筑人才招聘网
  • 企业网站的短视频中心模板灰色关键词排名技术
  • 卡曼科技网站建设网站安全狗
  • 企业网站配色居家网络架构
  • 泰安市两学一做网站杭州建设网站职称人才工作专题
  • 什么网站可以做特价活动网络建站系统
  • 观澜网站建设wordpress 装饰插件
  • 大朗仿做网站杭州笕桥网站建设
  • 网站托管什么意思wordpress新浪微博图床
  • 查看网站被百度收录培训课程网站
  • 企业营销型网站建设费用工业设计公司怎么接活
  • 重庆手机网站制作文件传输协议登录网站
  • 怎样选wordpress主题在婚纱店做网站优化
  • js做网站预览效果wordpress后台轮播图设置
  • 网站建设总结报告吉林网页制作公司