Spring4+quartz2的配置和代码方式调度

前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……

 

quartz定时任务必须搞清楚几个概念:

JobDetail——处理类

Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象

Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发器(因为触发器已经指定了对应的处理类),代码方式则需同时指定触发对象和触发器。

 

代码方式中,quartz2.x一般都是用相应工厂类来建立JobDetail和Trigger的。

 

一般来说,任务调度有2中方法,一种是只把Job定义为一个普通类,但同时在配置文件中必须指定targetObject和属性,废话不多说,上demo:

 

<!-- 任务类 -->
	 <bean id="test" class="org.test.job.Task1" />
	<bean id="task1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="test" />
		</property>
		<property name="targetMethod">
			<value>step1</value>
		</property>
	</bean>
	
	<bean id="task2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="test" />
		</property>
		<property name="targetMethod">
			<value>step2</value>
		</property>
	</bean>
	
	<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="task1" />
		</property>
		<property name="cronExpression">
			<value>0 0 11 * * ? *</value>
		</property>
	</bean>
	
	<bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="task2" />
		</property>
		<property name="cronExpression">
			<value>0 02 11 * * ? *</value>
		</property>
	</bean>
	
	<bean id="schedule1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="trigger1" />
				<ref bean="trigger2" />
			</list>
		</property>
	</bean>

 当然:我上面是在1个类里面定义2个方法,分别指定这2个方法的触发时间——这种情况不太常见,如果不需要,减少task和trigger就行。但对于我这里说到的这种情况,有无简化方法我暂时还未发现……

 

 

在这里,类Task1只是一个很普通的类。

 

方式2:继承QuartzJobBean类,同时必须重写executeInternal方法。

配置如下:

 

<!-- 任务类 -->
	 <bean id="job1" class="org.test.job.TestJob1" />
	<bean id="job2" class="org.test.job.TestJob2" /> 
	
	<!-- 定义触发器来管理任务bean -->
	<bean id="cronTriggerJob1" 
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
		p:cronExpression="0 52 17 * * ? *" >
		<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
			p:durability="true"
			p:jobClass="org.test.job.TestJob1"
			 />
		</property>
	</bean>
	
<bean id="cronTriggerJob2" 
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
		p:cronExpression="0 30 17 * * ? *" >
		<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
			p:durability="true"
			p:jobClass="org.test.job.TestJob2"
			 />
		</property>
	</bean>
	<!-- 执行实际的调度 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerJob1" />
			 	<ref bean="cronTriggerJob2" /> 
			</list>
		</property>
	</bean> 

 

 

这种方式还有代码写法:

 

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
			JobDetail jobDetail = JobBuilder.newJob(Job.class)
					.setJobData(new JobDataMap(Map map)).build();

                      //在某一时刻触发
			Trigger trigger = TriggerBuilder.newTrigger().startAt(Date date).build();
                   //在指定cron表达式的时间点触发
//		Trigger trigger = TriggerBuilder.newTrigger()
//				.withSchedule(CronScheduleBuilder.cronSchedule(String cron)).build();
                      //调度器将任务类与触发器关联
			scheduler.scheduleJob(jobDetail, trigger);
			scheduler.start();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在pom.xml中引入以下依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> ``` 其中,`${spring.version}`和`${quartz.version}`是对应的版本号。 接着,在Spring配置文件中配置`SchedulerFactoryBean`和`JobDetailFactoryBean`: ```xml <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!--自动启动 --> <property name="autoStartup" value="true" /> <!--配置数据源 --> <property name="dataSource" ref="dataSource" /> <!--配置Quartz的属性 --> <property name="quartzProperties"> <props> <prop key="org.quartz.scheduler.instanceName">Scheduler</prop> <prop key="org.quartz.scheduler.instanceId">AUTO</prop> <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> <prop key="org.quartz.scheduler.jmx.export">true</prop> <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> <prop key="org.quartz.jobStore.isClustered">false</prop> <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> <prop key="org.quartz.threadPool.threadCount">10</prop> <prop key="org.quartz.threadPool.threadPriority">5</prop> </props> </property> <!--配置JobDetail --> <property name="jobDetails"> <list> <bean id="jobDetailFactoryBean" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!--要执行的Job类 --> <property name="jobClass" value="com.example.job.MyJob" /> <!--Job的名称 --> <property name="name" value="MyJob" /> <!--Job的分组 --> <property name="group" value="MyJobGroup" /> <!--是否持久化 --> <property name="durability" value="true" /> <!--是否可以被其他任务替代 --> <property name="requestsRecovery" value="true" /> </bean> </list> </property> <!--配置Trigger --> <property name="triggers"> <list> <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!--绑定JobDetail --> <property name="jobDetail" ref="jobDetailFactoryBean" /> <!--触发器的名称 --> <property name="name" value="MyTrigger" /> <!--触发器的分组 --> <property name="group" value="MyTriggerGroup" /> <!--Cron表达式 --> <property name="cronExpression" value="0/10 * * * * ?" /> </bean> </list> </property> </bean> ``` 其中,`SchedulerFactoryBean`是Quartz的核心类,用于创建和管理Quartz的`Scheduler`对象。`JobDetailFactoryBean`用于创建`JobDetail`对象,`CronTriggerFactoryBean`用于创建`Trigger`对象。 在上述配置中,我们配置了一个名为`MyJob`的Job,它由`com.example.job.MyJob`类实现,执行逻辑在该类的`executeInternal()`方法中。我们还配置了一个名为`MyTrigger`的Trigger,它使用Cron表达式`0/10 * * * * ?`,表示每隔10秒执行一次。 最后,在`com.example.job.MyJob`类中实现我们的业务逻辑: ```java public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 执行业务逻辑 } } ``` 当配置完成后,启动Spring应用程序,Quartz就会按照我们的配置执行定时任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值