本文参考了博客网的博文《spring + quartz 定时器实现》,该博文地址为
http://www.cnblogs.com/hy928302776/archive/2013/03/06/2946079.html
原博文使用的是Quartz 2.X以下的版本,我使用的是Quartz 2.2.1版本,Spring版本请使用3.1以上的版本。
原博文Cron表达式是配置在方法级别的@interface上面,一个方法只能使用相同的Cron表达式,我把Cron表达式放在方法@interface上,个人觉得更符合实际,这样同一个类上面可以配置多个不同时间运行的定时器。下面是代码:
首先定义注解:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.stereotype.Component; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface MyTriggerType { String value() default ""; }
方法层面的注解:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyTriggerMethod { /** 定义定时器触发时间 */ String cronExpression() default ""; }
Job类:
@MyTriggerType public class MyAnnoJob { @MyTriggerMethod(cronExpression = "0/1 * * * * ?") public void execute() { System.out.println("定时任务,每秒执行一次----------------"); } @MyTriggerMethod(cronExpression = "0/3 * * * * ?") public void execute2() { System.out.println("定时任务,每三秒执行一次----------------"); } }
重新SchedulerFactoryBean类:
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean; public class MyTriggerSchedulerFactoryBean extends SchedulerFactoryBean { /** 日志 */ protected Log log = LogFactory.getLog(MySchedulerFactoryBean.class .getName()); /** Spring 上下文 */ private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public void registerJobsAndTriggers() throws SchedulerException { try { // 获取所有bean name String[] beanNames = applicationContext .getBeanNamesForType(Object.class); for (String beanName : beanNames) { Class<?> targetClass = applicationContext.getType(beanName); // 循环判断是否标记了MyTriggerType注解 if (targetClass.isAnnotationPresent(MyTriggerType.class)) { Object targetObject = applicationContext.getBean(beanName); // 获取时间表达式 String cronExpression = ""; String targetMethod = ""; MyTriggerMethod triggerMethod = null; // 确定标记了MyTriggerMethod注解的方法名 Method[] methods = targetClass.getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(MyTriggerMethod.class)) { targetMethod = method.getName(); triggerMethod = (MyTriggerMethod) method .getAnnotation(MyTriggerMethod.class); cronExpression = triggerMethod.cronExpression(); // 注册定时器业务类 registerJobs(targetObject, targetMethod, beanName, cronExpression); } } } } } catch (Exception e) { log.error(e); } } /** * 注册定时器 * * @param targetObject * @param targetMethod * @param beanName * @param cronExpression * @throws Exception */ private void registerJobs(Object targetObject, String targetMethod, String beanName, String cronExpression) throws Exception { // 声明包装业务类 MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean(); jobDetailFactoryBean.setTargetObject(targetObject); jobDetailFactoryBean.setTargetMethod(targetMethod); jobDetailFactoryBean.setBeanName(beanName + "_" + targetMethod + "_Task"); jobDetailFactoryBean.setName(beanName + "_" + targetMethod + "_Task"); jobDetailFactoryBean.setConcurrent(false); jobDetailFactoryBean.afterPropertiesSet(); //System.out.println(beanName + "_" + targetMethod+"-----cron=" + cronExpression); // 获取JobDetail JobDetail jobDetail = jobDetailFactoryBean.getObject(); // 声明定时器 CronTriggerFactoryBean cronTriggerBean = new CronTriggerFactoryBean(); cronTriggerBean.setJobDetail(jobDetail); cronTriggerBean.setCronExpression(cronExpression); cronTriggerBean.setName(beanName + "_" + targetMethod + "_Trigger"); cronTriggerBean.setBeanName(beanName + "_" + targetMethod + "_Trigger"); cronTriggerBean.afterPropertiesSet(); CronTrigger trigger = cronTriggerBean.getObject(); ; // 将定时器注册到factroy List<Trigger> triggerList = new ArrayList<Trigger>(); triggerList.add(trigger); Trigger[] triggers = (Trigger[]) triggerList .toArray(new Trigger[triggerList.size()]); setTriggers(triggers); super.registerJobsAndTriggers(); } }
quartz配置:
<?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:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd"> <bean id="job2" class="com.anno.MyAnnoJob" /> <bean id="MyTriggerScheduler" class="com.anno.MyTriggerSchedulerFactoryBean" /> </beans>
测试方法:
import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.quartz.SchedulerException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class TestAnnoTrigger { ApplicationContext context; public static void main(String[] args) throws Exception { TestAnnoTrigger t=new TestAnnoTrigger(); t.TestMyCron(); } public void TestMyCron() throws Exception{ context=new ClassPathXmlApplicationContext("classpath:config/myquartz-annoconfig.xml"); TimeUnit.MINUTES.sleep(2); } }
没有使用Junit原因是我的电脑点击Run As Junit Test半天没反应,只好这样写了。
全文完。
相关推荐
这将配置Quartz使用JDBC存储任务和触发器,并连接到本地的MySQL数据库。 二、创建Job类 1. 定义Job接口:Spring Boot中的Job需要实现`org.springframework.batch.core.Job`接口,但是这里我们使用Quartz,所以需要...
Spring通过`org.springframework.scheduling.quartz.SchedulerFactoryBean`来创建和配置Quartz Scheduler,并通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解来控制Job的行为。...
MyBatis 可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 5. **Maven**:Maven 是一个项目管理工具,它可以管理项目的构建、报告...
2. **配置Quartz** - 配置文件通常为`quartz.properties`,其中包含了数据库连接、线程池设置、JobStore类型等关键信息。 - 在`quartz.xml`中,可以定义Job和Trigger的关系,以及Job的详细属性。 3. **创建Job** ...
在Spring Boot中,我们可以通过实现`org.springframework.scheduling.Trigger`和`org.springframework.scheduling.Task`接口来自定义定时任务,或者使用`@Scheduled`注解来声明定时任务。这里我们使用`@Scheduled`为...
Quartz和Spring集成的一个重要方面是,Spring的`SchedulerFactoryBean`,它是Quartz调度器的Spring包装器,负责初始化和配置Quartz实例。通过`SchedulerFactoryBean`,我们可以设置Quartz的配置属性,例如数据库连接...
2. **初始化Scheduler**: 在Spring中,我们可以使用`QuartzJobBean`和`@DisallowConcurrentExecution`注解来管理作业,但在纯Quartz环境中,我们需要手动创建`Scheduler`实例。这可以通过`StdSchedulerFactory`类...
在标题"spring定时器的包和配置文件"中,我们讨论的核心是Spring如何配置和使用定时器来自动化执行特定的任务。 首先,让我们了解Spring定时任务的基本概念。Spring定时器基于Java的`java.util.Timer`和`java.util....
在Spring环境中,你可以通过注解来配置定时任务,比如使用@Scheduled注解来定义任务执行的频率和时间。Spring Task同样支持SimpleTrigger和CronTrigger类型的任务触发规则。Spring Task的配置简单,容易上手,且与...
7. **Spring整合**:在Spring中配置Quartz,通过`SchedulerFactoryBean`来创建和管理Scheduler实例。通过`@DisallowConcurrentExecution`注解可以防止同一任务在单个实例中并发执行,但这个注解并不适用于集群环境。...
2. **配置Quartz**:在Spring的配置文件中,我们需要配置一个`SchedulerFactoryBean`,用于创建和管理Quartz的Scheduler实例。在这里,我们可以设置一些基本的Quartz属性,如线程池大小、存储策略等。 3. **定义Job...
对于Quartz,虽然配置方式类似,但是可以利用Spring 3.0的简化特性,例如使用`@Configuration`和`@EnableScheduling`注解来实现。 总结一下,Spring定时任务的使用涉及到以下几个核心概念: 1. **...
在SpringBoot项目中,我们可以利用Spring的内置定时器或者集成第三方库Quartz来实现定时任务。 首先,SpringBoot自身提供的定时任务功能是通过`@EnableScheduling`注解来开启的。例如,在`ScheduledTasks`类中,...
2. **配置Quartz**:在Spring配置文件中配置Quartz的相关属性,如数据源、JobStore类型(内存、数据库等)、线程池大小等。 3. **定义Job和Trigger**:编写代表具体任务的Job类,实现`org.quartz.Job`接口,并在...
Spring定时器,通常指的是Spring框架中的任务调度模块,它基于Quartz库进行封装,使得在Spring应用中配置和管理定时任务变得更为简便。本篇文章将深入探讨Spring如何配置定时器,以及如何使用它来执行定期任务。 ...
在Java中,我们可以使用多种方式实现定时任务,如Java的`java.util.Timer`类、`java.util.concurrent.ScheduledExecutorService`,以及第三方库如Quartz Scheduler和Spring Framework的`@Scheduled`注解。...
- 为了提高性能,可以考虑使用集群模式,让多个Quartz Scheduler实例共享同一套Job和Trigger配置。 - 对于复杂的定时逻辑,可以使用Cron表达式,它能提供灵活的定时规则设置。 总之,通过Spring与Quartz的整合,...
开发者需要自定义Job类,并实现`org.quartz.Job`接口,覆盖`execute`方法来编写实际的业务逻辑。 2. **Trigger**:触发器决定了Job何时运行。常见的Trigger类型有SimpleTrigger(简单触发器)和CronTrigger(cron...
2. **Spring的`TaskScheduler`接口**:如果你需要更复杂的调度策略,或者想要自定义定时任务的实现,可以使用`TaskScheduler`接口。通过实现这个接口,你可以控制任务的并发执行、任务队列等高级特性。 3. **配置...
1. **@EnableScheduling**:在配置类上添加此注解,开启Spring的定时任务功能。 2. **@Scheduled**:在方法上添加此注解,声明该方法为定时任务。可以指定cron表达式、固定延迟或初始延迟等参数。 四、Cron表达式 ...