`
53873039oycg
  • 浏览: 837235 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用自定义注解配置Quartz定时器

阅读更多

    本文参考了博客网的博文《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半天没反应,只好这样写了。

    全文完。

   

 

分享到:
评论

相关推荐

    spring boot集成quartz定时器

    这将配置Quartz使用JDBC存储任务和触发器,并连接到本地的MySQL数据库。 二、创建Job类 1. 定义Job接口:Spring Boot中的Job需要实现`org.springframework.batch.core.Job`接口,但是这里我们使用Quartz,所以需要...

    spring之quartz定时器

    Spring通过`org.springframework.scheduling.quartz.SchedulerFactoryBean`来创建和配置Quartz Scheduler,并通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解来控制Job的行为。...

    shiro+SpringMVC+Spring+mybatis+maven+mybatis 自动刷新+ Quartz scheduler 定时器

    MyBatis 可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 5. **Maven**:Maven 是一个项目管理工具,它可以管理项目的构建、报告...

    quartz简易定时器

    2. **配置Quartz** - 配置文件通常为`quartz.properties`,其中包含了数据库连接、线程池设置、JobStore类型等关键信息。 - 在`quartz.xml`中,可以定义Job和Trigger的关系,以及Job的详细属性。 3. **创建Job** ...

    Springboot2+quartz实现定时器的增删改查.rar

    在Spring Boot中,我们可以通过实现`org.springframework.scheduling.Trigger`和`org.springframework.scheduling.Task`接口来自定义定时任务,或者使用`@Scheduled`注解来声明定时任务。这里我们使用`@Scheduled`为...

    定时器 quartz 和 spring

    Quartz和Spring集成的一个重要方面是,Spring的`SchedulerFactoryBean`,它是Quartz调度器的Spring包装器,负责初始化和配置Quartz实例。通过`SchedulerFactoryBean`,我们可以设置Quartz的配置属性,例如数据库连接...

    脱离spring的quartz声明式定时器(jar包齐全)

    2. **初始化Scheduler**: 在Spring中,我们可以使用`QuartzJobBean`和`@DisallowConcurrentExecution`注解来管理作业,但在纯Quartz环境中,我们需要手动创建`Scheduler`实例。这可以通过`StdSchedulerFactory`类...

    spring定时器的包和配置文件

    在标题"spring定时器的包和配置文件"中,我们讨论的核心是Spring如何配置和使用定时器来自动化执行特定的任务。 首先,让我们了解Spring定时任务的基本概念。Spring定时器基于Java的`java.util.Timer`和`java.util....

    使用java定时器的几种方式

    在Spring环境中,你可以通过注解来配置定时任务,比如使用@Scheduled注解来定义任务执行的频率和时间。Spring Task同样支持SimpleTrigger和CronTrigger类型的任务触发规则。Spring Task的配置简单,容易上手,且与...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    7. **Spring整合**:在Spring中配置Quartz,通过`SchedulerFactoryBean`来创建和管理Scheduler实例。通过`@DisallowConcurrentExecution`注解可以防止同一任务在单个实例中并发执行,但这个注解并不适用于集群环境。...

    spring动态定时器封装

    2. **配置Quartz**:在Spring的配置文件中,我们需要配置一个`SchedulerFactoryBean`,用于创建和管理Quartz的Scheduler实例。在这里,我们可以设置一些基本的Quartz属性,如线程池大小、存储策略等。 3. **定义Job...

    pring定时器的使用

    对于Quartz,虽然配置方式类似,但是可以利用Spring 3.0的简化特性,例如使用`@Configuration`和`@EnableScheduling`注解来实现。 总结一下,Spring定时任务的使用涉及到以下几个核心概念: 1. **...

    springboot整合quartz实现定时任务示例

    在SpringBoot项目中,我们可以利用Spring的内置定时器或者集成第三方库Quartz来实现定时任务。 首先,SpringBoot自身提供的定时任务功能是通过`@EnableScheduling`注解来开启的。例如,在`ScheduledTasks`类中,...

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

    开发者可以根据实际需求选择使用`@Scheduled`注解、`cron`表达式或者自定义的`TaskScheduler`来实现定时任务,极大地提高了应用的灵活性和可维护性。在分析和理解具体的"springjob"代码时,需要关注任务的定义、调度...

    spring定时器所需jar包

    2. **配置Quartz**:在Spring配置文件中配置Quartz的相关属性,如数据源、JobStore类型(内存、数据库等)、线程池大小等。 3. **定义Job和Trigger**:编写代表具体任务的Job类,实现`org.quartz.Job`接口,并在...

    spring定时器配置

    Spring定时器,通常指的是Spring框架中的任务调度模块,它基于Quartz库进行封装,使得在Spring应用中配置和管理定时任务变得更为简便。本篇文章将深入探讨Spring如何配置定时器,以及如何使用它来执行定期任务。 ...

    简单易用的java定时器scheduler,有完整配置说明

    在Java中,我们可以使用多种方式实现定时任务,如Java的`java.util.Timer`类、`java.util.concurrent.ScheduledExecutorService`,以及第三方库如Quartz Scheduler和Spring Framework的`@Scheduled`注解。...

    spring+quartz动态设置定时时间

    - 为了提高性能,可以考虑使用集群模式,让多个Quartz Scheduler实例共享同一套Job和Trigger配置。 - 对于复杂的定时逻辑,可以使用Cron表达式,它能提供灵活的定时规则设置。 总之,通过Spring与Quartz的整合,...

    Quartz学习

    开发者需要自定义Job类,并实现`org.quartz.Job`接口,覆盖`execute`方法来编写实际的业务逻辑。 2. **Trigger**:触发器决定了Job何时运行。常见的Trigger类型有SimpleTrigger(简单触发器)和CronTrigger(cron...

    java定时器结合spring

    2. **Spring的`TaskScheduler`接口**:如果你需要更复杂的调度策略,或者想要自定义定时任务的实现,可以使用`TaskScheduler`接口。通过实现这个接口,你可以控制任务的并发执行、任务队列等高级特性。 3. **配置...

Global site tag (gtag.js) - Google Analytics