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+Spring应用与集群

〇、前言使用SPRING的定时任务框架,如果是在分布式的环境下,由于有多台节点,会产生相同的任务,会被多个节点执行,这时需引入分布式的QUARTZ。一、Quartz集群部署实践Quartz与Sprin...

spring+Quartz集群

最近项目中使用了spring+Quartz定时任务、但是项目最近要集群部署、多个APP下如何利用Quartz 协调处理任务。       大家可以思考一下、现在有 A、B、C三个应用同时作为集群...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

spring quartz集群

spring quartz 集群配置信息

spring+quartz集群下复杂应用

项目环境,weblogic集群,quartz版本1.6.6。 一、应用实例 1. spring配置:

spring+mybatis+quartz集群

1. 定义数据源 bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="in...

Spring Quartz集群(二)

先看看quartz的持久化基本介绍:  引用 1 大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便...

Quartz应用与集群原理分析

一、问题背景 美团CRM系统中每天有大量的后台任务需要调度执行,如构建索引、统计报表、周期同步数据等等,要求任务调度系统具备高可用性、负载均衡特性,可以管理并监控任务的执行流程,以保证任务的正确...

Quartz应用与集群原理分析

一、问题背景 美团CRM系统中每天有大量的后台任务需要调度执行,如构建索引、统计报表、周期同步数据等等,要求任务调度系统具备高可用性、负载均衡特性,可以管理并监控任务的执行流程,以保证任务的正确...

Quartz应用与集群原理分析

转自:http://tech.meituan.com/mt-crm-quartz.html 一、问题背景 美团CRM系统中每天有大量的后台任务需要调度执行,如构建索引、统计报表、周...

Quartz应用与集群原理分析

Quartz应用与集群原理分析 zhanshenny,meituan_crm ·2014-08-31 22:35 一、问题背景 美团CRM系统中每天有大量的后台任务需要调度执行,如构建索引、统...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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