`

spring日记(十):任务调度和异步执行器

阅读更多

博客新地址:http://yidao620c.github.io

 

>> 在spring中使用quartz

创建JobDetailBean:

<!-- 通过JobDetailBean实现 -->
<bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"
    p:jobClass="com.baobaotao.quartz.MyJob"
    p:applicationContextJobDataKey="applicationContext">
    <property name="jobDataAsMap">
        <map>
            <entry key="size" value="10" />
        </map>
    </property>
</bean>

在JobDetailBean中有几个属性:

jobClass:类型为Class,实现了Job接口的任务类

beanName:显示指定Bean名称,没啥用处

jobDataAsMap:类型为Map,为任务所对应的JobDataMap提供值。

applicationContextJobDataKey:用户可以通过这个key值将Spring的ApplicationContext的引用保存在里面。

jobListenerNames:类型为String[],指定注册在Schedule中的JobListeners名称。

下面是MyJob定义:

import java.util.Map;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.springframework.context.ApplicationContext;
 
public class MyJob implements StatefulJob {
    public void execute(JobExecutionContext jctx) throws JobExecutionException {
//      Map dataMap = jctx.getJobDetail().getJobDataMap();
        Map dataMap = jctx.getTrigger().getJobDataMap();
        String size =(String)dataMap.get("size");
        ApplicationContext ctx = (ApplicationContext)dataMap.get("applicationContext");
        System.out.println("size:"+size);
        dataMap.put("size",size+"0");
         
        String count =(String)dataMap.get("count");
        System.out.println("count:"+count);
    }
}

如果MyJob实现的是StatefulJob,那么里面的JobDataMap为共享公共变量,下次执行的时候还可以获得同样的,这个不是线程安全的,最好都用无状态的Job

>> 利用MethodInvokingJobDetailFactoryBean直接将某个bean的方法定义成任务执行的动作,也就是说不需要定义JobDetail了,直接将某个bean的方法变成job的execute方法:

<!-- 通过封装服务类方法实现 -->
<bean id="jobDetail_1"
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
    p:targetObject-ref="myService" p:targetMethod="doJob" p:concurrent="false" />
 
<bean id="myService" class="com.baobaotao.service.MyService" />

>> 创建Trigger:

* SimpleTriggerBean

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
    p:jobDetail-ref="jobDetail" p:startDelay="1000" p:repeatInterval="2000"
    p:repeatCount="100">
    <property name="jobDataAsMap">
        <map>
            <entry key="count" value="10" />
        </map>
    </property>
</bean>

SimpleTriggerBean在SimpleTrigger基础上增加了以下属性:

jobDetail:对应的JobDetail

beanName:默认为bean的id,不过之前用beanName属性显示指定了名称的也可以用这个

jobDetailAsMap:以Map类型为Trigger关联的JobDataMap提供值

startDelay:延迟多少时间触发,单位为毫秒,默认为0

triggerListenerNames:类型为String[],不解释了

>> CronTriggerBean

<bean id="checkImagesTrigger"
      class="org.springframework.scheduling.quartz.CronTriggerBean"
      p:jobDetail-ref="jobDetail"
      p:cronExpression="0/5 * * * * ?"/>

>> 创建Scheduler

spring提供了ScheduleFactoryBean,可以在spring容器启动后,Scheduler自动开始工作,而在spring容易关闭前,自动关闭Scheduler

<bean id="scheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="simpleTrigger" />
        </list>
    </property>
    <property name="schedulerContextAsMap">
        <map>
            <entry key="timeout" value="30" />
        </map>
    </property>
    <property name="configLocation" value="classpath:com/baobaotao/quartz/quartz.properties" />
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.threadPool.class">
                org.quartz.simpl.SimpleThreadPool
            </prop>
            <prop key="org.quartz.threadPool.threadCount">10</prop>
        </props>
    </property>
</bean>

SchedulerFactoryBean还拥有一些常见的属性:

* calendars:类型为Map,通过该属性向Scheduler注册Calendar

* jobDetails:类型为JobDetail[],注册JobDetail

* autoStartup:是否马上启动Scheduler,默认为true

* startupDelay:延迟多少秒启动Scheduler

* dataSource:当需要数据库持久化任务调度数据时候用到

* transactionManager:当配一个dataSource后,应该同步配置这个

* nonTransactionalDataSource:无事务的数据源

* quartzProperties:允许用户在spring中定义Quartz属性,覆盖quartz.properties文件中的定义

>> spring对于JDK5中的Executor的支持

JDK5本身提供的ThreadPoolExecutor类实现了Executor和ExecutorService这两个接口,它使用一个线程池对提交的任务进行调度,对于需要处理数量巨大的短小并发任务如Web服务器、数据库服务器、邮件服务器之类的应用程序需要处理大量来自远程的大量短小任务,采用线程池可以带来明显好处。

ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类,并实现了ScheduledExecutorService接口,添加了对任务的调度功能,该类明显优于JDK1.3中的Timer,因为在内部用线程池,对每次到来的任务用一个新线程去执行,而不是像TImer那么,要等这个任务执行完,才能执行下一个任务,很好的解决了Timer经常出现的时间漂移、任务挤压等问题。

工厂类Executors有很多方法很方便的创建这些线程池:

* public static  ExecutorService newFixedThreadPool(int nThreads):固定数目的线程数量

* public static ExecutorService newCachedThreadPool():线程池动态的,不够就创建新的,长时间不用就回收

* public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) :创建一个线程池,可以在指定延迟后运行或定期执行任务

import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
 
public class ExecutorExample {
    private TaskExecutor executor;
    public void setExecutor(TaskExecutor executor) {
        this.executor = executor;
    }
    public void executeTasks() {
        for (int i = 0; i < 6; i++) {
            executor.execute(new SimpleTask("task" + i));
        }
    }
    public static void main(String[] args) {
        ExecutorExample ee = new ExecutorExample();
        ee.setExecutor(new SimpleAsyncTaskExecutor());
        ee.executeTasks();
    }
}
class SimpleTask implements Runnable {
    private String taskName;
    public SimpleTask(String taskName) {
        this.taskName = taskName;
    }
    public void run() {
        System.out.println("do " + taskName + "... in Thread:"
                + Thread.currentThread().getId());
    }
}
分享到:
评论

相关推荐

    spring 任务调度

    - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,包括`@Scheduled`注解用于标记定时任务,以及`TaskScheduler`和`ThreadPoolTaskScheduler`接口用于异步执行任务。 - **@...

    spring 任务调度实现代码例子

    这个“spring 任务调度实现代码例子”很可能是包含了一些示例代码,用于演示如何在Spring应用中配置和使用任务调度。下面将详细解释Spring任务调度的关键概念和实现方法。 1. **Spring Task模块** Spring Task是...

    Spring实现任务调度.rar

    `TaskExecutor`用于异步执行任务,而`TaskScheduler`则用于计划未来的任务执行。这两个接口提供了灵活的策略来控制任务的执行方式。 1. **Spring TaskExecutor**: `TaskExecutor`接口提供了一个简单的API来执行...

    spring线程池(同步、异步).docx

    在Spring框架中,线程池的...同步执行器如`SyncTaskExecutor`适用于简单同步任务,而异步执行器如`ThreadPoolTaskExecutor`则适用于需要并行处理任务的情况。通过配置,我们可以调整线程池的参数以优化性能和资源利用。

    spring的定时任务和异步方法

    需要注意的是,异步方法必须在一个启用了`@EnableAsync`的配置类中使用,Spring会自动配置一个任务执行器来处理这些异步任务。 Spring的定时任务和异步方法是提高系统效率和实现复杂业务逻辑的重要工具。通过合理...

    spring任务调度实例

    TaskExecutor提供了异步执行任务的能力,但需要注意的是,Timer在处理多个定时任务时可能会有线程安全问题,因此在大型项目中通常不推荐使用。 在本实例中,你将学习到如何设置Quartz和Timer,以及如何在Spring中...

    spring实现任务的自动调度所需的jar包

    在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。Quartz是一个流行的任务调度库,被广泛用于Java应用程序中,包括Spring项目。在本篇中,我们将深入探讨如何使用...

    Java课程实验 Spring Boot 任务管理(源代码+实验报告)

    使用@Async注解可以将普通的方法异步执行,使其成为一个异步任务。可以在方法上添加@Async注解并配合@EnableAsync注解将其激活。 4.使用第三方库,如Quartz: 除了使用Spring Boot提供的任务管理功能外,可以使用第...

    Spring定时调度简单实现源码

    同样,`ThreadPoolTaskExecutor`是`TaskExecutor`的实现,用于异步执行任务。 4. **配置定时任务**: 在Spring配置文件中,我们需要声明一个`TaskScheduler`或`TaskExecutor`的bean,并配置相应的属性,如线程池...

    spring调度器用到的jar

    Spring Task是Spring Framework的一部分,提供了异步任务执行和定时任务调度的能力。它包括两个主要部分:`TaskExecutor`用于异步任务执行,而`TaskScheduler`则用于定时任务调度。 1. TaskExecutor:这是一个接口...

    Spring定时任务实现(非Web项目)

    1. **配置Spring Task**:在Spring的配置文件(如`applicationContext.xml`或使用Java配置类)中,我们需要启用任务调度功能并配置相应的执行器或调度器。例如,使用Java配置可以这样写: ```java @Configuration @...

    spring调度器

    Spring调度器主要由两个核心组件组成:`TaskExecutor`和`TaskScheduler`,它们分别用于异步执行任务和计划任务。 **TaskExecutor** `TaskExecutor`是Spring提供的一个接口,用于执行异步任务。通过实现这个接口,你...

    spring3.0异步

    Spring 3.0引入了`@Async`注解,该注解可以标记在方法上,声明该方法为异步执行。为了启用异步处理,需要配置`AsyncConfigurer`接口或者`&lt;task:annotation-driven/&gt;`元素,并提供一个`Executor` bean来处理异步任务...

    spring定时任务关键jar包(齐全)

    `spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...

    springboot异步任务案例

    在Spring Boot框架中,异步任务处理是一种常见需求,它能提高应用的性能和响应速度。Spring Boot提供了简单易用的API和注解来支持异步任务的实现,特别是通过`@Async`注解和定时任务`@Scheduled`。下面我们将深入...

    使用Spring Task开发定时任务的Demo

    Spring Task还支持异步执行任务,通过`@Async`注解,可以将任务方法标记为异步执行,提高系统并发性能。 ```java @Service @EnableAsync public class AsyncService { @Async public void longRunningTask() { ...

    Spring_任务调试源码

    首先,Spring框架的`Task`模块提供了丰富的任务调度功能,它允许开发者定义和执行异步任务,以及按计划执行周期性任务。Spring的任务调度主要包括两种方式:基于`ThreadPoolTaskExecutor`的并发执行和基于`...

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

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

    spring的计时器

    5. `ThreadPoolTaskScheduler`和`ThreadPoolTaskExecutor`:这两个类分别实现了`TaskScheduler`和`TaskExecutor`接口,它们使用线程池来并发执行任务,是Spring中常用的调度和执行组件。 6. 配置定时任务:在Spring...

    Spring AOP、IOC、cxf、任务调度所需jar包以及配置文件

    Spring提供了TaskExecutor和TaskScheduler接口,用于执行异步任务和定时任务。你可以配置一个任务调度器,然后定义任务,比如邮件发送,根据需要定时触发。邮件发送功能通常会用到JavaMailSender接口,Spring提供了...

Global site tag (gtag.js) - Google Analytics