Spring中的异步任务、线程池、定时器定时任务

1Spring异步任务

 

开启异步配置(@EnableAsync注解指定或标签配置

1、用Java注解:

 

第一步:在类的申明前使用@EnableAsync注解开启异步调用功能。

第二步:public AsyncTaskExecutor taskExecutor() 方法自定义自己的线程池,线程池前缀”Anno-Executor”。如果不定义,则使用系统默认的线程池。

 

@EnableAsync // 启动异步调用

public class AsyncApplicationWithAnnotation {

/* 略 */

/**

     * 自定义异步线程池

     * @return

     */

    @Bean

    public AsyncTaskExecutor taskExecutor() { 

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setThreadNamePrefix("Anno-Executor");

        executor.setMaxPoolSize(10); 

 

        // 设置拒绝策略

        executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {

            @Override

            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

                // .....

            }

        });

        return executor; 

    }

}
  

 

2、用XML配置:

 

第一步:使用标签定义线程池

第二步:使用标签启动异步线程池配置

如下spring-async.xml配置:

 

    

    

    

    
  

 

有关线程池的拒绝策略,参考下文:

线程池--拒绝策略RejectedExecutionHandler

 

编写异步任务(@Async注解指定)

 

1、编写普通Java类,并设置方法为@Async注解

 

  只需要简单这么一步即可在执行注解方法时自动由Spring框架执行异步操作。

p

ackage tech.bbwang.springtask.scheduled.demo;

 

import org.springframework.stereotype.Component;

import java.util.Date;

 

@Component

public class ScheduledTaskExample {

    public ScheduledTaskExample(){
    }

    @Async
    public void printTime(){
       System.out.println((new Date()).toString());
    }
}
 

 

2、线程池

 

配置线程池

 

最简单的形式,只需要在spring配置文件里加一条配置即可。

 

 

 添加此配置需要在Spring配置文件的头部添加下面的约束文件(task相关处的命名空间)

 

 

 

使用线程池

线程池xmlExecutor作为一个Spring的bean存在,可以被注入到需要的地方。

比如:

 

定义一个使用线程池的类TaskExecutorExample,该类使用线程池跑10个打印当前时间的任务。

 

package tech.bbwang.springtask.demo;

import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import tech.bbwang.App;

import java.util.HashMap;
import java.util.Map;

/**

 * 任务执行样例

 */

@Component

public class TaskExecutorExample

{

   private TaskExecutor taskExecutor;

    public TaskExecutorExample(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }

    public void printMessages() {

        for(int i = 0; i <10; i++) {
           taskExecutor.execute(new Runnable(){
            public void run(){
            System.out.println((new Date()).toString());
           }

         });
        }
    }

}
 

 

Spring配置文件设置:

 





    
    
        
        
        
    
     
        
    
 

 

3、定时器和定时任务

 

定义定时器

 

spring配置文件:

 


 

 

定义定时任务

 

spring配置文件:

 


        
        
        
        
        
    
 

 

有关corn表达式可以参考:

Cron表达式生成器

cron表达式详解

 

定义定时任务类

 

 

package tech.bbwang.springtask.scheduled.demo;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class ScheduledTaskExample {

    public ScheduledTaskExample(){
    }
     @Async
    public void printTime(){
        System.out.println((new Date()).toString());
    }
}

 

 

 定义运行类

其实已经完全由Spring配置解决了运行问题,只需要给一个运行Spring配置的主函数即可。

 

package tech.bbwang;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.concurrent.CountDownLatch;

public class SpringAsyncTask {

   public static void main( String[] args )
    {
        new ClassPathXmlApplicationContext("spring-async*.xml");
    }
}

 

你可能感兴趣的:(Spring,异步任务,线程池,定时器定时任务)