Quartz+Spring应用与集群

原创 2016年06月01日 09:50:50

〇、前言

使用SPRING的定时任务框架,如果是在分布式的环境下,由于有多台节点,会产生相同的任务,会被多个节点执行,这时需引入分布式的QUARTZ。

一、Quartz集群部署实践

Quartz与Spring结合使用,Spring通过提供org.springframework.scheduling.quartz下的封装类对Quartz支持。

Quartz集群部署:

image

Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点。该集群需要分别对每个节点分别启动或停止,不像应用服务器的集群,独立的Quartz节点并不与另一个节点或是管理节点通信。Quartz应用是通过数据库表来感知到另一应用。只有使用持久的JobStore才能完成Quqrtz集群。

二、基于Sping的集群配置

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <beans>
        <bean id="sampleJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="sampleJobDetail" />
            <property name="cronExpression" value="0 0/1 * * * ?" />
        </bean>

        <bean id="sampleJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="jobClass"  value="com.feng.ini.modules.trd.quartz.SampleJob"/>
            <property name="durability" value="true" />
        </bean>

        <!-- 调度工厂 -->
        <bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 配置属性 -->
            <property name="quartzProperties">
                <props>
                    <prop key="org.quartz.scheduler.instanceName">OrderScheduler</prop>
                    <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
                    <!-- 线程池配置 -->
                    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
                    <prop key="org.quartz.threadPool.threadCount">5</prop>
                    <prop key="org.quartz.threadPool.threadPriority">5</prop>
                    <!-- 集群配置 -->
                    <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                    <prop key="org.quartz.jobStore.isClustered">true</prop>
                    <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>
                    <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>
                    <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
                    <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
                </props>
            </property>
            <property name="schedulerName" value="OrderScheduler" />
            <!-- QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 -->
            <property name="startupDelay" value="30" />
            <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
            <!-- QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->
            <property name="overwriteExistingJobs" value="true" />
            <!-- 自动启动 -->
            <property name="autoStartup" value="true" />
            <!-- 注册触发器 -->
            <property name="triggers">
                <list>
                    <ref bean="sampleJobTrigger" />
                </list>
            </property>
            <!-- 注册任务详情 -->
            <property name="jobDetails">
                <list>
                    <ref bean="sampleJobDetail" />
                </list>
            </property>
            <!-- 注册任务调度监听器 -->
            <property name="schedulerListeners">
                <list></list>
            </property>
        </bean>

    </beans>
</beans>

三、添加Job类

package com.feng.ini.modules.trd.quartz;

import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import xin.ini.common.utils.DateUtils;

public class SampleJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("job-1:" + DateUtils.formatDateTime(new Date()) + "," + context.getFireInstanceId() + "," + context.getJobDetail().getClass().getName());
    }

}

四、分布式部署多个任务

为了测试,在同一个Tomcat中部署了4个任务,分别为job-1、2、3、4,以下是执行结果:

job-22016-05-28 16:23:00,Yuk14644237475091464423747488,org.quartz.impl.JobDetailImpl
job-32016-05-28 16:24:00,Yuk14644237583351464423758320,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:25:00,Yuk14644237689031464423768887,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:26:00,Yuk14644237689031464423768888,org.quartz.impl.JobDetailImpl
job-12016-05-28 16:27:00,Yuk14644238098361464423809814,org.quartz.impl.JobDetailImpl
job-22016-05-28 16:28:00,Yuk14644237475091464423747489,org.quartz.impl.JobDetailImpl
job-32016-05-28 16:29:00,Yuk14644237583351464423758321,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:30:00,Yuk14644237689031464423768889,org.quartz.impl.JobDetailImpl
job-32016-05-28 16:31:00,Yuk14644237583351464423758322,org.quartz.impl.JobDetailImpl
job-22016-05-28 16:32:00,Yuk14644237475091464423747490,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:33:00,Yuk14644237689031464423768890,org.quartz.impl.JobDetailImpl
job-32016-05-28 16:34:00,Yuk14644237583351464423758323,org.quartz.impl.JobDetailImpl
job-12016-05-28 16:35:00,Yuk14644238098361464423809815,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:36:00,Yuk14644237689031464423768891,org.quartz.impl.JobDetailImpl
job-32016-05-28 16:37:00,Yuk14644237583351464423758324,org.quartz.impl.JobDetailImpl
job-22016-05-28 16:38:00,Yuk14644237475091464423747491,org.quartz.impl.JobDetailImpl
job-12016-05-28 16:39:00,Yuk14644238098361464423809816,org.quartz.impl.JobDetailImpl
job-42016-05-28 16:40:00,Yuk14644237689031464423768892,org.quartz.impl.JobDetailImpl

从结果可以看出,同一时刻,只执行了一个任务,而且是4个任务都是随机执行。

五、参考资料

http://tech.meituan.com/mt-crm-quartz.html?utm_source=tuicool&utm_medium=referral Quartz应用与集群原理分析
http://www.blogjava.net/paulwong/archive/2014/11/14/420104.html 分布式调度QUARTZ+SPRING
http://blog.csdn.net/evankaka/article/details/45361759 【Quartz】深入Job、JobDetail、JobDataMap、Trigger

版权声明:本文为博主原创文章,未经博主允许不得转载。

Quartz入门实例12-Spring4和quartz2的集群

使用spring4.0.6 和 quartz 2.2.1 整合进行集群
  • a67474506
  • a67474506
  • 2014年08月04日 12:42
  • 9161

Quartz集成springMVC 的方案二 ---持久化、分布式集群部署

项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题,...
  • OXiaoMianYiJiu
  • OXiaoMianYiJiu
  • 2016年11月10日 10:54
  • 1579

Springboot集成quartz之集群模式(第三期)

Springboot集成quartz之集群模式(第三期)本期将提供quartz集群能力 集群案例分析: 上一期的邮件发送功能,若在服务需要部署多节点,但定时任务不支持集群,因此,多节点定时任务势必会...
  • musuny
  • musuny
  • 2017年07月22日 22:45
  • 2885

spring+quartz集群下复杂应用

项目环境,weblogic集群,quartz版本1.6.6。 一、应用实例 1. spring配置:
  • dragonlibra
  • dragonlibra
  • 2013年03月21日 20:45
  • 1194

Spring整合Quartz定时任务 在集群、分布式系统中的应用

概述 虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性、高可靠性满足。假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应...
  • I_will_try
  • I_will_try
  • 2017年12月22日 08:50
  • 111

spring3+quartz1.6.4 集群示例

  • 2016年09月20日 16:49
  • 5.07MB
  • 下载

Spring Quartz Job 集群 终极解决方案

  • 2013年05月31日 15:55
  • 5.31MB
  • 下载

spring4.0.6+quartz 2.2.3 集群示例

  • 2016年09月20日 16:32
  • 2.83MB
  • 下载

Spring集群整合Quartz

  • 2016年12月08日 16:07
  • 7.29MB
  • 下载

在Spring中使用Quartz任务调度支持集群(转载)

虽然在Quartz上有配置Quartz集群Clustering ,但是在Spring中使用Quartz任务调度并支持集群系统却有些问题,下面介绍解决办法: 环境:(环境非常重要,注意版本号) ...
  • dos_186
  • dos_186
  • 2015年08月20日 15:42
  • 873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quartz+Spring应用与集群
举报原因:
原因补充:

(最多只允许输入30个字)