相关文章推荐
稳重的冰淇淋  ·  pytorch ...·  1 年前    · 
想出家的山寨机  ·  学习 React Hooks ...·  1 年前    · 
  • 异步任务,@Async
  • 当然,使用这两个是有条件的,需要在spring应用的上下文中声明
    <task:annotation-driven/> 当然,如果我们是基于java配置的,需要在配置哪里加多 EnableScheduling @EnableAsync 就像下面这样

    @EnableScheduling
    @EnableAsync
    public class WebAppConfig {
    public final static long ONE_DAY = 24 * 60 * 60 * 1000;
    public final static long ONE_HOUR = 60 * 60 * 1000;
    @Scheduled(fixedRate = ONE_DAY)
    public void scheduledTask () {
    System.out.println( " 我是一个每隔一天就会执行一次的调度任务");
    @Scheduled(fixedDelay = ONE_HOURS)
    public void scheduleTask2 () {
    System.out.println( " 我是一个执行完后,隔一小时就会执行的任务");
    @Scheduled(initialDelay= 1000, fixedRate= 5000)
    public void doSomething () {
    // something that should execute periodically
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void ScheduledTask3 () {
    System.out.println( " 我是一个每隔一分钟就就会执行的任务");

    @Async

    有时候我们会调用一些特殊的任务,任务会比较耗时,重要的是,我们不管他返回的后果。这时候我们就需要用这类的异步任务啦,调用后就让他去跑,不堵塞主线程,我们继续干别的。代码像下面这样:

    public void AsyncTask (){
    @Async
    public void doSomeHeavyBackgroundTask ( int sleepTime) {
    try {
    Thread.sleep(sleepTime);
    } catch (InterruptedException e) {
    e.printStackTrace();
    @Async
    public Future<String> doSomeHeavyBackgroundTask () {
    try {
    Thread.sleep( 3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    return null;
    public void printLog () {
    System.out.println( " i print a log ,time=" + System.currentTimeMillis());
    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(classes = AsycnTaskConfig.class) //要声明@EnableASync
    public class AsyncTaskTest {
    @Autowired
    AsyncTask asyncTask;
    @Test
    public void AsyncTaskTest() throws InterruptedException {
    if (asyncTask != null) {
    asyncTask .doSomeHeavyBackgroundTask( 4000);
    asyncTask .printLog();
    Thread .sleep( 5000);

    这感觉比我们手动开多一个线程方便多了,不想异步的话直接把 @Async 去掉就可以了,另外如果你想要返回个结果的,这需要加多个Future<>,关于这个Future,完全可以写多几篇文章介绍,顺便把FutureTask介绍了。如果想修改Spring boot的默认线程池配置,可以实现AsyncConfigurer.
    需要注意的:

  • 相对于 @scheduled ,这个可以有参数和返回个结果,因为这个是我们调用的,而调度的任务是spring调用的。
  • 异步方法不能内部调用,只能像上面那样,外部调用,否则就会变成阻塞主线程的同步任务啦!这个坑我居然跳下去了!例如下面这样的。
  • public class MyAsyncUncaughtExceptionHandler implements
    AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException (Throwable ex,
    Method method, Object... params) {
    // handle exception
    @Override
    public Executor getAsyncExecutor () {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize( 7);
    executor.setMaxPoolSize( 42);
    executor.setQueueCapacity( 11);
    executor.setThreadNamePrefix( "MyExecutor-");
    executor.initialize();
    return executor;
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler () {
    return new MyAsyncUncaughtExceptionHandler();

    Quartz登场

    处理这两个外,还有一个和spring整合的第三方库叫 Quartz
    看了下官网的使用简介,也是挺逗的,现在都习惯用maven,gradle之类来关系这些依赖了,他还叫人下载,也是不知为何,详情点击->
    http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start
    估计有可能是因为没再维护了的原因吧,看了下,最新版2.2居然是Sep, 2013更新的…
    居然是停更的,不过Quartz作为一个企业级应用的任务调度框架,还是一个可以的候选项目的。
    这里不铺开讲,有兴趣就去官网看下吧。整体用起来感觉是没有spring自己的后台任务方便,不过也可以接受,只需要简单的配置就可以使用了。

    http://www.cnblogs.com/slimer/p/6401394.html

    我的心血全在这了,这种方式讲@Async原理,你别再不懂Spring了
    想你在看这篇文章之前有过使用@Async注解进行任务异步处理的经历,在项目开发过程中,针对非主流程、非实时、耗时的任务,往往会进行异步处理,这样既不会影响主流程,还会提高主流程的响应时间。
    【七日打卡】Spring中如何方便的使用Async异步方法
    在Spring提供了@Async来实现方法的异步调用。 即当调用标有@Async标识的方法时,调用线程不会等待被调用方法执行完后再继续执行后续操作,而对被调用的方法启动一个独立线程来执行。 这种异步执行的方式通常用于处理接口中不需要返回给用户的数据处理
    异步事务?关于异步@Async + 事务@Transactional的结合使用问题分析【享学Spring MVC】(下)
    异步事务?关于异步@Async + 事务@Transactional的结合使用问题分析【享学Spring MVC】(下)
    异步事务?关于异步@Async + 事务@Transactional的结合使用问题分析【享学Spring MVC】(上)
    异步事务?关于异步@Async + 事务@Transactional的结合使用问题分析【享学Spring MVC】(上)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(下)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(下)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(中)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(中)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(上)
    从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】(上)
    使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享学Spring】(下)
    使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享学Spring】(下)