Spring定时器quartz配置

Quartz 是一个开源的强大的企业级任务调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。


Spring中继承并简化了Quartz,Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。


Spring的配置文件:

<span style="font-family:SimSun;font-size:14px;">	<!-- quartz持久化存储 -->
	<bean id="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource"/>
		</property>
		<property name="jobFactory">
			<bean class="com.esoft.core.quartz.AutowiringSpringBeanJobFactory" />
			<!-- <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/> -->
		</property>		<property name="schedulerName" value="Mscheduler" />
		<property name="configLocation" value="classpath:quartz.properties" /></span>
<span style="font-family:SimSun;font-size:14px;">		<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
		<property name="autoStartup" value="true" />
	</bean></span>

      属性说明:

        dataSource:项目中用到的数据源,里面包含了quartz用到的数据库表;
        jobFactory:能在quartz的job中,注入spring的对象 
        schedulerName:调度器名,我理解主要在调度集群的时候会有用,如果出现多个调度器实例的时候可以用来进行区分,详细看一下《Quartz Job Scheduling Framework 》
        applicationContextSchedulerContextKey通过applicationContextSchedulerContextKey属性配置spring上下文
        configLocation:用于指明quartz的配置文件的位置,如果不用spring配置quartz的话,本身quartz是通过一个配置文件进行配置的,默认是  quartz.properties,里面配置的参数在quartz的doc文档中都有介绍,可以调整quartz配置的参数
        autoStartup:是否自动启动,该Bean被初始化后是否自动启动定时任务。如果是false表示不自动启动,则需要调用scheduler.start()进行启动。

加入配置文件quartz.properties

<pre name="code" class="html"><span style="font-family:SimSun;font-size:14px;">#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler   属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。   
##因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。   
##这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。   
#============================================================================
#org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#havent cluster spring
#org.quartz.jobStore.dataSource = myDS 
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false  
#org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。   
#这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。   
#org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(单位:毫秒)。   
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#==============================================================  </span>

 

org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同。 org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。 org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。 org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(单位:毫秒)。Scheduler 检查是否其他的实例到了它们应当检入的时候未检入;这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval 越小,Scheduler 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)。

另外,配置JobFactory使得QuartzJob可以@Autowired注入spring托管的实例。内容如下:

public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
		implements ApplicationContextAware {

	private transient AutowireCapableBeanFactory beanFactory;

	@Override
	public void setApplicationContext(final ApplicationContext context) {
		beanFactory = context.getAutowireCapableBeanFactory();
	}

	@Override
	protected Object createJobInstance(final TriggerFiredBundle bundle)
			throws Exception {
		final Object job = super.createJobInstance(bundle);
		beanFactory.autowireBean(job);
		return job;
	}
}

设置调度

// 调度,到期自动改状态

JobDetail jobDetail = JobBuilder.newJob(CheckLoanOverExpectTime.class)
.withIdentity(loan.getId(),
<span style="white-space:pre">							</span>


ScheduleConstants.JobGroup.CHECK_LOAN_OVER_EXPECT_TIME)
<span style="white-space:pre">					</span>.build();// 任务名,任务组,任务执行类
<span style="white-space:pre">			</span>jobDetail.getJobDataMap().put


(CheckLoanOverExpectTime.LOAN_ID,
<span style="white-space:pre">					</span>loan.getId());
<span style="white-space:pre">			</span>SimpleTrigger trigger = TriggerBuilder
<span style="white-space:pre">					</span>.newTrigger()
<span style="white-space:pre">					</span>.withIdentity(
<span style="white-space:pre">							</span>loan.getId(),
<span style="white-space:pre">							</span>


ScheduleConstants.TriggerGroup.CHECK_LOAN_OVER_EXPECT_TIME)
<span style="white-space:pre">					</span>.forJob(jobDetail)
<span style="white-space:pre">					</span>.withSchedule


(SimpleScheduleBuilder.simpleSchedule())
<span style="white-space:pre">					</span>.startAt(loan.getExpectTime()).build();
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>scheduler.scheduleJob(jobDetail, trigger);



Job任务
<span style="white-space:pre">	</span>// 调度,到期自动改项目状态
<span style="white-space:pre">			</span>JobDetail jobDetail = JobBuilder
<span style="white-space:pre">					</span>.newJob(CheckLoanOverExpectTime.class)
<span style="white-space:pre">					</span>.withIdentity(
<span style="white-space:pre">							</span>loan.getId(),
<span style="white-space:pre">							</span>ScheduleConstants.JobGroup.CHECK_LOAN_OVER_EXPECT_TIME)
<span style="white-space:pre">					</span>.build();// 任务名,任务组,任务执行类
<span style="white-space:pre">			</span>jobDetail.getJobDataMap().put(CheckLoanOverExpectTime.LOAN_ID,
<span style="white-space:pre">					</span>loan.getId());
<span style="white-space:pre">			</span>SimpleTrigger trigger = TriggerBuilder
<span style="white-space:pre">					</span>.newTrigger()
<span style="white-space:pre">					</span>.withIdentity(
<span style="white-space:pre">							</span>loan.getId(),
<span style="white-space:pre">							</span>ScheduleConstants.TriggerGroup.CHECK_LOAN_OVER_EXPECT_TIME)
<span style="white-space:pre">					</span>.forJob(jobDetail)
<span style="white-space:pre">					</span>.withSchedule(SimpleScheduleBuilder.simpleSchedule())
<span style="white-space:pre">					</span>.startAt(loan.getExpectTime()).build();
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>scheduler.scheduleJob(jobDetail, trigger);
在你的Job接口实现类里面,添加逻辑到execute()方法。一旦你配置好Job实现类并设定好调度时间表,Quartz将密切注意剩余时间。当调度程序确定该是通知你的作业的时候,Quartz框架将调用你Job实现类(作业类)上的execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用任何特定的东西。仅仅执行任务和结束任务即可。如果配置你的作业在随后再次被调用,Quartz框架将在恰当的时间再次调用它。


集群Quartz应用
Quartz应用能被集群,是水平集群还是垂直集群取决于你自己的需要。集群提供以下好处:··伸缩性
·高可用性
·负载均衡
Quartz可以借助关系数据库和JDBC作业存储支持集群。
Terracotta扩展quartz提供集群功能而不需要数据库支持


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值