Springboot实现集成定时器和多线程异步处理

  介绍

这篇文章将为大家详细讲解有关Springboot实现集成定时器和多线程异步处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强> Springboot集成多线程异步,直接上配置:

/* *   *线程池异步配置   */@ configuration   @EnableAsync   公开课ThreadExecutorConfig   实现AsyncConfigurer {      @Override   公共执行人getAsyncExecutor () {   ThreadPoolTaskExecutor执行人=new ThreadPoolTaskExecutor ();//设置核心线程数   executor.setCorePoolSize (5);//设置最大线程数   executor.setMaxPoolSize (7);//设置队列容量   executor.setQueueCapacity (20);//设置线程活跃时间(秒)   executor.setKeepAliveSeconds (60);//设置默认线程名称   executor.setThreadNamePrefix(“帕斯卡产生绯闻);//设置拒绝策略   遗嘱执行人。setRejectedExecutionHandler(新ThreadPoolExecutor.CallerRunsPolicy ());//等待所有任务结束后再关闭线程池   executor.setWaitForTasksToCompleteOnShutdown(真正的);   executor.initialize ();   返回执行人;   }      @Override   公共AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler () {   返回新MyAsyncUncaughtExceptionHandler ();   }   }

下面的是对多线程异步的时候报出的异常处理方法,可以自定义一个处理多线程异常类来实现自身的业务逻辑。

进口org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
  进口java.lang.reflect.Method;
  
  公共类MyAsyncUncaughtExceptionHandler实现
  AsyncUncaughtExceptionHandler {
  @Override
  公共空间handleUncaughtException (Throwable的前女友,
  方法方法,对象……params) {//处理异常
  }
  }

启动类上要记得添加异步和开启定时器的标签

@SpringBootApplication   @EnableScheduling   @Async   公开课MultithreadingApplication {      公共静态void main (String [] args) {   SpringApplication.run (MultithreadingApplication.class, args);   }   }

业务逻辑方法:

 @Async
  @Scheduled (initialDelay=1000, fixedDelay=5000)
  公共空白测试(){
  SimpleDateFormat格式=new SimpleDateFormat (“HH: mm: ss");
  尝试{
  logger.info(“当前线程为:“+ Thread.currentThread () . getname() +“,方法开始时间为:“+ format.format(新日期()));
  thread . sleep (10000);
  logger.info(“当前线程为:“+ Thread.currentThread () . getname() +“,方法结束时间为:“+ format.format(新日期()));
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }

<>强对于@Schedule注解的使用方法:

<强>点进去可以看到有几个可选参数:

fixedDelay:控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次

fixedRate:是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。

initialDelay:如:@Scheduled (initialDelay=10000, fixedRate=15000

这个定时器就是在上一个的基础上加了一个initialDelay=10000意思就是在容器启动后,延迟10秒后再执行一次定时器,以后每15秒再执行一次该定时器。

cron表达式可以定制化执行任务,但是执行的方式是与fixedDelay相近的,也是会按照上一次方法结束时间开始算起。

这里可以根据自身的业务需求,看到底选择哪一个更适合,这里cron表达式就不再多言,可以结合自身应用场景来定

这样,需求就实现了

测试结果:

 32360 11:12:40.436信息20-07-07 - - - - - -[主要]o.s.b.w.embedded.tomcat。TomcatWebServer: Tomcat开始>/* *
  *配置多个时间表的线程配置
  */@ configuration
  @EnableScheduling
  公共类ScheduleConfig实现SchedulingConfigurer {/*
  *并行任务
  */公共空间configureTasks (ScheduledTaskRegistrar taskRegistrar)
  {
  ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler ();
  taskScheduler.setThreadNamePrefix(“时间表任务产生绯闻,);
  taskScheduler.setPoolSize (5);
  taskScheduler.setAwaitTerminationSeconds (60);
  taskScheduler.setWaitForTasksToCompleteOnShutdown(真正的);
  taskScheduler.initialize ();
  taskRegistrar.setTaskScheduler (taskScheduler);
  }
  }

Springboot实现集成定时器和多线程异步处理