`
bbwang8088
  • 浏览: 45980 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

1Spring异步任务

 

开启异步配置(@EnableAsync注解指定或<task:annotation-driven>标签配置

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配置:

 

第一步:使用<task:executor>标签定义线程池

第二步:使用<task:annotation-driven>标签启动异步线程池配置

如下spring-async.xml配置:

 

    <!-- 等价于 @EnableAsync, executor指定线程池 -->

    <task:annotation-driven executor="xmlExecutor"/>

    <!-- id指定线程池产生线程名称的前缀 -->

    <task:executor

        id="xmlExecutor"

        pool-size="5-25"

        queue-capacity="100"

        keep-alive="120"

        rejection-policy="CALLER_RUNS"/>
  

 

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

线程池--拒绝策略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配置文件里加一条配置即可。

 

<task:executor id="xmlExecutor" pool-size="2" />

 

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

 

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://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-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 

 

使用线程池

线程池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配置文件设置:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:component-scan base-package="tech.bbwang.springtask.demo"/>
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="5" />
        <property name="maxPoolSize" value="10" />
        <property name="queueCapacity" value="25" />
    </bean>
     <bean id="taskExecutorExample" class="tech.bbwang.springtask.demo.TaskExecutorExample">
        <constructor-arg ref="taskExecutor" />
    </bean>
</beans>
 

 

3、定时器和定时任务

 

定义定时器

 

spring配置文件:

 

<!-- pool-size:此参数默认为1,此时,不同的定时任务不可同时进行,因为线程数不够。需要自己设置>1的数值来保证,同一个定时任务前一个未完成情况下不启动下一个,但不用的定时任务可以同时进行-->
<task:scheduler id="taskScheduler" pool-size="10"/>
 

 

定义定时任务

 

spring配置文件:

 

<task:scheduled-tasks>
        <!-- 配置定时任务,cron=一秒一次-->
        <task:scheduled ref="scheduledTaskExample" method="printTime" cron="0/5 * * * * ?"/>
        <!-- 配置定时任务,cron=每日0时和12时各执行一次任务-->
        <!--Cron表达式生成器 http://www.pdtools.net/tools/becron.jsp-->
        <!--<task:scheduled ref="scheduledTaskExample" method="printTime" cron="0/1 0/1 0,12 * * ?"/>-->
    </task:scheduled-tasks>
 

 

有关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中的线程池和定时任务功能解析

    基于Spring中的线程池和定时任务功能解析 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能。TaskExecutor是一个抽象接口,定义了execute方法,...

    spring定时器,定时调用任务配置

    在Spring框架中,定时任务是通过Spring Task模块来实现的,它提供了强大的任务调度和执行功能,能够方便地实现应用程序中的周期性任务。本篇将详细介绍如何配置和使用Spring的定时器来定时调用任务。 首先,让我们...

    springboot 定时任务(线程配置,并行【同步】、异步等)

    本教程将深入探讨如何配置并实现Spring Boot中的定时任务,包括线程配置、并行同步和异步执行等关键概念。 首先,我们需要了解Spring Boot中的定时任务基础。通过添加`@EnableScheduling`注解到某个配置类,我们...

    Spring3.0 mvc 定时器及多线程任务demo

    在Spring 3.0 MVC框架中,定时器和多线程任务是两个关键概念,用于构建高效、自动化的Web应用程序。下面将详细讲解这两个概念及其在实际应用中的使用。 一、Spring 3.0 MVC定时器 在Spring 3.0中,我们可以使用...

    定时器/线程池

    在IT领域,线程池和定时器是两个关键的概念,它们在系统性能优化和任务调度中扮演着重要角色。ThreadPoolTaskScheduler是Spring框架提供的一种线程池实现,它被设计用于执行定时任务,而Quartz则是一个流行的任务...

    spring定时器实例

    这个实例,"spring定时器实例",显然关注的是如何在Spring中实现定时任务。下面我们将深入探讨Spring中的任务调度机制以及如何创建和配置定时任务。 Spring提供了两种主要的调度组件:`org.springframework....

    java定时器结合spring

    Java定时器结合Spring框架可以创建灵活且可扩展的定时任务,这种技术在许多企业级应用中非常常见,用于执行周期性的后台任务,如数据清理、报告生成或服务调用等。下面将详细介绍如何在Spring中集成Java定时器,并...

    spring 定时器的 .jar包

    这个"spring 定时器的 .jar包"显然包含了用于在Spring环境中实现定时任务的关键组件。让我们详细了解一下Spring中的定时任务机制及其相关的库。 Spring提供了一个名为`Spring Task`的模块,也称为Spring调度器,它...

    spring 定时器

    Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring提供的一种用于执行计划任务的工具。这个模块使得开发者能够方便地在应用程序中安排周期性任务,而无需依赖像Quartz或Cron...

    spring定时器相关资料

    Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring提供的一个强大而灵活的任务调度框架。它允许开发者在应用中安排周期性任务的执行,无需直接依赖底层的调度实现,如 Quartz ...

    spring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rar

    Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个功能在企业级应用中非常常见,例如定期备份、数据清理、日志归档等。Spring定时器通过集成Quartz或...

    Spring提供的线程池支持[借鉴].pdf

    此外,Spring还提供了对任务调度的支持,比如通过`ThreadPoolTaskScheduler`实现基于线程池的定时任务调度,它可以与`TaskExecutor`一起使用,提供灵活的任务调度能力。这使得应用程序能够在指定的时间间隔执行周期...

    Spring自己的轻量级定时器的两种实现方式

    1. `ThreadPoolTaskScheduler`:Spring提供的一个线程池调度器,可以用于更复杂、异步的任务调度。首先,我们需要配置一个`ThreadPoolTaskScheduler`实例: ```xml &lt;bean id="taskScheduler" class="org.spring...

    java定时任务调度

    - Spring Boot中也可以使用`@Async`注解配合`@EnableAsync`实现异步任务,虽然这不是真正意义上的定时任务,但可以用于并发执行。 5. **分布式定时任务**: - 在分布式环境下,如集群环境,单节点的定时任务可能...

    spring定时器

    Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个简单demo可能展示了如何在Spring应用中设置和运行定时任务,以帮助开发者自动化执行某些周期性工作...

    Spring3.1 定时器配置所需jar包-文档-xml配置-class类-maven-IDEA

    在Spring 3.1中,可以通过`ThreadPoolTaskExecutor`和`ThreadPoolTaskScheduler`实现这两个接口,以创建线程池来处理定时任务。 为了配置Spring 3.1的定时器,我们需要添加相关的依赖到项目的Maven pom.xml文件中。...

    spring定时器例子

    在Java应用中,我们经常需要执行一些后台任务,比如数据清理、日志备份或者定期同步数据,这时Spring定时器就派上用场了。这个"spring定时器例子"是一个针对初学者的教程,旨在帮助他们理解和使用这一功能。 Spring...

    java中的定时器实现---调度

    Spring框架提供了丰富的定时任务支持,使得在Java环境中实现定时器变得更加简单和灵活。本篇文章将深入探讨如何在Spring中实现定时任务调度。 首先,我们需要了解Spring的`TaskScheduler`接口和`...

    SpringTimer定时器的功能

    Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring框架提供的一种用于执行定时任务的强大工具。它允许开发者在应用中设置定时任务,实现周期性操作,如数据同步、日志清理、...

    Spring Timers

    在Java开发中,Spring框架是不可或缺的一部分,尤其在...以上就是使用Spring实现定时器的基础知识,通过理解并实践这些内容,初学者可以轻松地在自己的项目中集成定时任务功能。希望这对你在Spring开发之路上有所帮助。

Global site tag (gtag.js) - Google Analytics