miaoshi的gravatar头像
miaoshi 2017-12-23 16:57:41

Spring整合Quartz实现分布式集群实例

最近项目做了负载均衡,而项目又用Quartz做了定时任务,导致在部署多系统后任务重复执行;所以用Quartz集群解决这一问题。

保障Quartz在分布部署时只有一个定时任务运行,并且在当前运行定时任务的服务器发生宕机后,另外的服务器能接管Quartz定时任务,进行继续执行。

1.Quartz集群架构图:

Spring整合Quartz实现分布式集群实例

2.Quartz如何保证多个节点的应用只进行一次调度

Quartz的集群是在同一个数据库下, 由数据库的数据来确定调度任务是否正在执行, 正在执行则其他服务器就不能去执行该行调度数据。

3.Quartz集群主要配置代码:

<bean id="scheduler" lazy-init="true" autowire="no"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="autoStartup" value="true" />
		<property name="triggers">
			<list>
			     <!-- 配置启动时间 -->
				 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
					<property name="jobDetail" ref="TestJobDetail" />
					<property name="cronExpression" value="10 * * * * ?" />
				</bean>  
			</list>
		</property>
	   
		<!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->
        <property name="overwriteExistingJobs" value="true"/>
		<!-- 属性 -->
		<property name="quartzProperties">
			<props>
				<!-- 集群要求必须使用持久化存储 -->
				<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreCMT</prop>
                <prop key="org.quartz.scheduler.instanceName">EventScheduler</prop>
				<!-- 每个集群节点要有独立的instanceId -->
				<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
				<!-- Configure ThreadPool -->
				<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
				<prop key="org.quartz.threadPool.threadCount">50</prop>
				<prop key="org.quartz.threadPool.threadPriority">5</prop>
				<prop key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>
				<!-- Configure JobStore -->
				<prop key="org.quartz.jobStore.misfireThreshold">60000</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.maxMisfiresToHandleAtATime">10</prop>
				<!-- 开启集群 -->
				<prop key="org.quartz.jobStore.isClustered">true</prop>
				<prop key="org.quartz.jobStore.clusterCheckinInterval">${job.clusterCheckinInterval}</prop>
				<prop key="org.quartz.jobStore.dontSetAutoCommitFalse">true</prop>
				<prop key="org.quartz.jobStore.txIsolationLevelSerializable">false</prop>
				<prop key="org.quartz.jobStore.dataSource">myDS</prop>
				<prop key="org.quartz.jobStore.nonManagedTXDataSource">myDS</prop>
				<prop key="org.quartz.jobStore.useProperties">false</prop>
				<!-- Configure Datasources -->
				<prop key="org.quartz.dataSource.myDS.driver">${db.driver}</prop>
				<prop key="org.quartz.dataSource.myDS.URL">${db.url}</prop>
				<prop key="org.quartz.dataSource.myDS.user">${db.username}</prop>
				<prop key="org.quartz.dataSource.myDS.password">${db.password}</prop>
				<prop key="org.quartz.dataSource.myDS.maxConnections">${db.maxConnections}</prop>
				<prop key="org.quartz.dataSource.myDS.validationQuery">select 0 from qrtz_locks</prop>
			</props>
		</property>
		<property name="applicationContextSchedulerContextKey" value="applicationContext" />
	</bean>

4.运行截图:

Spring整合Quartz实现分布式集群实例


打赏

已有1人打赏

最代码官方的gravatar头像

文件名:Quartz.zip,文件大小:4763.574K 下载
  • /
      • /Quartz
        • /Quartz/.classpath
          • /Quartz/.myeclipse
          • /Quartz/.mymetadata
          • /Quartz/.project
            • /Quartz/.settings
              • /Quartz/.settings/.jsdtscope
              • /Quartz/.settings/org.eclipse.jdt.core.prefs
              • /Quartz/.settings/org.eclipse.wst.common.component
              • /Quartz/.settings/org.eclipse.wst.common.project.facet.core.xml
    顶部 客服 微信二维码 底部
    >扫描二维码关注最代码为好友扫描二维码关注最代码为好友