Spring+Quartz实现定时任务的maven完整demo(idea)

17 篇文章 0 订阅
5 篇文章 0 订阅

例子说明

下面以每10s调用类中一个函数为例。下面的日志输出采用slf4j+log4j,不需要的可自行改为System.out.println输出

代码

idea目录如下所示:
在这里插入图片描述

1.配置文件quartz_timer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="myQuartzTimer" class="com.ydfind.demo.springtimer.MyQuartzTimer"></bean>
    <bean id="myQuartzTimerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="myQuartzTimer"/>
        </property>
        <property name="targetMethod" value="doTask"/>
    </bean>
    <bean id="myQuartzTimerTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="myQuartzTimerJob"/>
        <!-- 确保quartz的版本在1.8.6及以前的,否则会报错;每10s跑一次-->
        <property name="cronExpression" value="0/10 * 0-23 * * ?"/>
    </bean>
    <bean class = "org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref local="myQuartzTimerTrigger" />
            </list>
        </property>
    </bean>
</beans>
2.log4j.xml日志配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "./log4j.dtd">
<log4j:configuration>
	<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%-d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t] %X{operationName} %X{userId} - %m%n" />
		</layout>
	</appender>
	<root>
		<appender-ref ref="consoleAppender" />
	</root>
</log4j:configuration>
3.maven的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <groupId>com.ydfind</groupId>
    <artifactId>spring-timer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <springframework.version>4.0.6.RELEASE</springframework.version>
        <quartz.version>1.8.6</quartz.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring事务的依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 定时任务框架Quartz的依赖-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz.version}</version>
        </dependency>
    </dependencies>
</project>
4.定时器类 MyQuartzTimer.java
package com.ydfind.demo.springtimer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyQuartzTimer {
    private static Logger logger = LoggerFactory.getLogger(MyQuartzTimer.class);
    private static int count;
    public void doTask(){
        try{
            synchronized (this){
                count++;
            }
            logger.info("第" + count + "次执行!当前时间为:" + new SimpleDateFormat("yyyyMMdd HH:mm:ss:SSS").format(new Date()));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
5.启动定时器的类 MyQuartzMainApp.java
package com.ydfind.demo.springtimer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MyQuartzMainApp {
    private static Logger logger = LoggerFactory.getLogger(MyQuartzMainApp.class);
    public static void main(String[] args){
        logger.info("将要启动定时器---------");
        try{
            new FileSystemXmlApplicationContext(ClassLoader.getSystemResource("quartz_timer.xml").getFile());
        }catch (Exception e){
            e.printStackTrace();
        }
        logger.info("将要结束定时器---------");
    }
}

运行

运行MyQuartzMainApp类的main函数,结果如下:

[2019-03-20 13:24:40.022][DEBUG][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1]   - Calling execute on job DEFAULT.myQuartzTimerJob
[2019-03-20 13:24:40.022][INFO][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1]   - 第1次执行!当前时间为:20190320 13:24:40:022
[2019-03-20 13:24:50.006][DEBUG][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2]   - Calling execute on job DEFAULT.myQuartzTimerJob
[2019-03-20 13:24:50.021][INFO][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2]   - 第2次执行!当前时间为:20190320 13:24:50:021
[2019-03-20 13:25:00.007][DEBUG][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3]   - Calling execute on job DEFAULT.myQuartzTimerJob
[2019-03-20 13:25:00.007][INFO][org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3]   - 第3次执行!当前时间为:20190320 13:25:00:007

每10s运行一次,正确。

cron

@Scheduled(cron = “0 32,34,37 13,14 * * ?”)
表示13或14点的32、34、37分钟分别触发一次

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Boot和Quartz实现定时任务管理,可以让你更方便地管理和监控你的定时任务。下面是一个使用Spring Boot、QuartzSpring MVC实现定时任务管理的示例: 首先,在你的Spring Boot应用程序中添加QuartzSpring MVC的依赖项: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 然后,在你的Spring Boot应用程序中创建一个Quartz的调度器,并添加一个Spring MVC的Controller来管理定时任务: ```java @Configuration public class QuartzConfig { @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(myTaskTrigger().getObject()); return schedulerFactoryBean; } @Bean public JobDetailFactoryBean myTaskJob() { JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(MyTask.class); return jobDetailFactoryBean; } @Bean public CronTriggerFactoryBean myTaskTrigger() { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(myTaskJob().getObject()); cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?"); // 每5秒执行一次 return cronTriggerFactoryBean; } } @RestController public class TaskController { @Autowired private Scheduler scheduler; @PostMapping("/tasks") public void addTask(@RequestBody TaskInfo taskInfo) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(taskInfo.getJobClass()) .withIdentity(taskInfo.getJobName(), taskInfo.getJobGroup()) .build(); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(taskInfo.getTriggerName(), taskInfo.getTriggerGroup()) .withSchedule(CronScheduleBuilder.cronSchedule(taskInfo.getCronExpression())) .build(); scheduler.scheduleJob(jobDetail, trigger); } @DeleteMapping("/tasks/{jobName}/{jobGroup}") public void deleteTask(@PathVariable String jobName, @PathVariable String jobGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.deleteJob(jobKey); } } ``` 在上面的代码中,我们创建了一个Spring MVC的Controller来管理定时任务。我们使用了Scheduler类来添加和删除定时任务。在添加定时任务时,我们使用了TaskInfo类来封装定时任务的信息。在删除定时任务时,我们使用了jobName和jobGroup来识别定时任务。 最后,在你的定时任务类中实现Job接口,并在类上添加@DisallowConcurrentExecution注解,以确保每个任务执行时只有一个实例: ```java @Component @DisallowConcurrentExecution public class MyTask implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务执行的代码 } } ``` 以上就是使用Spring Boot、QuartzSpring MVC实现定时任务管理的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值