quartz,spring-quartz,spring-task,spring-schedule

介绍 quartz,spring-quartz,spring-task,spring-schedule

一:quartz

  • quartz是一个调度器,可以放任务进去,对任务指定时间执行。
  • demo如下
    • 1.0 maven依赖
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>
  • 1.1
在CLASSPATH下创建 quartz.properties 文件
#指定了调度器名字
org.quartz.scheduler.instanceName = MyScheduler
#线程池最大线程数量
org.quartz.threadPool.threadCount = 3
#指定调度器存储任务的方式,这个是存储在内存中。
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
  • 1.2 job
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println(123);
    }
}


import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest {
    public static void main(String[] args) throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();
        JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();
        scheduler.scheduleJob(job, trigger);
        //关闭调度器
        //scheduler.shutdown();
    }
}

二:spring-quartz

spring-quartz只是spring对quartz的一个包装而已。其实现是在spring-context-support中。

  • 如果是固定的任务,可以使用xml配置,包括以下都需要在xml中配置
    • org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
    • org.springframework.scheduling.quartz.JobDetailFactoryBean
    • org.springframework.scheduling.quartz.JobDetailFactoryBean
    • org.springframework.scheduling.quartz.SimpleTriggerFactoryBean
    • org.springframework.scheduling.quartz.CronTriggerFactoryBean
    • 核心 org.springframework.scheduling.quartz.SchedulerFactoryBean

以上这些相互依赖,共同组成调度任务。

  • 如果是做动态的调度则

核心是:

    <bean id="quartzScheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
        <property name="configLocation" value="classpath:quartz.properties" />
        <!--应用启动完后 QuartzScheduler 再启动 -->
        <property name="startupDelay" value="0" />
    </bean>

java引入

    @Autowired
    private org.quartz.Scheduler scheduler;
    这个时候,就可以使用该接口的所有方法

三:spring-task

spring-task完全是spring自己的调度实现,其代码是在spring-context中,有2种方式1种是xml,另一种是注解形式。spring-task也支持cron表达式

3.1

spring.xml头部依赖
xmlns:task=”http://www.springframework.org/schema/task”
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd

xml配置

<task:scheduled-tasks> 
   <!-- taskJob是一个service类,job1是方法,-->
   <task:scheduled ref="taskJob" method="job1" cron="*/2 * * * * ?"/> 
</task:scheduled-tasks> 

java代码如下

@Service//(默认的serviceName是taskJob)
public class TaskJob {
    public void job1() {
        System.out.println("任务进行中。。。");
    }
}

3.2 注解

注解任务的java代码是

@Component("taskJobAnno")
public class TaskJobAnno {

    @Scheduled(cron = "*/2 * * * * ?")
    public void job1() {
        System.out.println("注解任务进行中。。。");
    }
}

xml配置:注意这里的xml也需要引入xmlns头信息

<task:annotation-driven scheduler="qbScheduler" mode="proxy"/> 
<task:scheduler id="qbScheduler" pool-size="10"/> 

四:spring-schedule

spring-schedule就是spring-task

spring-quartz和spring-task区别

  • 1
  • 2

猜你喜欢

转载自blog.csdn.net/faicm/article/details/78716962