2 qq 17858533 qq_17858533 于 2016.02.17 15:57 提问

quartz重复执行的问题

最近用到quartz做集群,需求每隔一段时间执行一次任务。
发现在配置较短的时间间隔,比如15秒钟执行一次时,会出现,服务器启动会有多个线程(不等,有时候2个,多的时候4个,quartz线程数目用的默认的10个)重复执行该任务。
控制台信息如下:图片说明

而当我配置成1min执行一次的时候,就没有问题,不会重发执行。
主要的配置文件如下,求解,感谢感谢。

<bean id="autoRepeatRequestTask"
        class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass">
            <value>com..job.AutoRequestRepeatJob</value>
        </property>
        <property name="durability" value="true" />
        <property name="requestsRecovery" value="true" />
    </bean>
    <!-- 定义触发时间 -->
    <bean id="autoRepeatRequestDoTime"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="autoRepeatRequestTask" />
        </property>
        <!-- cron表达式 -->
        <property name="cronExpression">
            <value>0 * * * * ?</value>
            <!--每分钟执行一次 -->
        </property>
    </bean>
    <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
    <bean id="startQuartz" lazy-init="false" autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
        destroy-method="destroy">
        <property name="configLocation" value="classpath:quartz.properties" />
        <property name="triggers">
            <list>
                <ref bean="autoRepeatRequestDoTime" />
            </list>
        </property>
        <property name="startupDelay" value="10" />
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
    </bean>

执行的任务类:


@PersistJobDataAfterExecution
@DisallowConcurrentExecution // 不允许并发执行
public class AutoRequestRepeatJob extends QuartzJobBean {
    private static final Logger LOGGER = LoggerFactory.getLogger(AutoRequestRepeatJob.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println(Thread.currentThread().getName()+"------初始化了"+DateTimeUtils.getNowHHmmss());
        RequestRepeatService requestRepeatService = getApplicationContext(context).getBean(RequestRepeatService.class);
        requestRepeatService.autoRepeatRequest();

    }

    private ApplicationContext getApplicationContext(final JobExecutionContext jobexecutioncontext) {
        try {
            return (ApplicationContext) jobexecutioncontext.getScheduler().getContext().get("applicationContextKey");
        } catch (SchedulerException e) {
            LOGGER.error("jobexecutioncontext.getScheduler().getContext() error!", e);
            throw new RuntimeException(e);
        }
    }

}

2个回答

qq_17858533
qq_17858533   2016.02.17 16:43
已采纳

quartz集群配置

 #==============================================================    
#Configure Main Scheduler Properties    
#==============================================================     
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=AUTO_REPEAT_REQUEST
#============================================================================  
# Configure JobStore    
#============================================================================  
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=15000
org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
#============================================================================  
# 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 Datasources       
#============================================================================    
qq_17858533
qq_17858533 org.quartz.jobStore.misfireThreshold = 60000
2 年多之前 回复
qq_17858533
qq_17858533   2016.02.17 16:46

或者是因为我的具体的任务写的有问题,里面用到了线程池。因为开辟的线程池没有释放? 求解求解

  private static ListeningExecutorService FixedExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(FIXED_THREAD_NUM));
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
quartz定时,重复的问题
quartz自己多次执行,没有集群,就是自己在执行时(短时间内)又执行了...原因不明
Spring的quartz定时器重复执行二次的问题解决
Spring的quartz定时器重复执行二次的问题解决 quartzSpringWebXMLTomcat . 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此。 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程。 研究下来发现quartz确实会加载两次: 第一次:w
Quartz任务重复执行的问题
为解决邮件发送两封的问题,特修改quartz配置文件,将其从spring-mvc.xml文件中移出,放入单独的文件中,经凌李测试,只发送一封邮件。根据如下: 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此。 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程。 研究下
Quartz重复执行问题
原文地址:http://www.cnblogs.com/nfsnyy/p/5741593.html 本人所在的项目组做了一个基于quartz集群的任务系统。通俗点讲就是用quartz框架(quartz是一款能跑定时任务的框架支持复杂的时间表达式)来执行定时任务。但是这里定时任务的并发数很多,就出现了一个问题,同一个trigger被多个机器重复的触发了,这就造成了执行的任务数目比预
quartz 2.2.3集群场景job重复执行问题
版本:quartz 2.2.3环境:2台linux机器搭建集群问题现象:1个10s循环执行的job,每隔10s会同时在2台机器进行调度执行。问题分析过程:首先baidu了一些网上类似问题,有些是单点出现重复执行的,跟本问题现象不一样;还有些集群出现的重复执行问题,给出的解决思路是自己另外写一个表加数据库锁或者分布式锁或者一致性工具zookeeper,通过这些手段来保证一致性。个人感觉quartz已...
Tomcat集群Spring+Quartz多次执行解决方案记录
由于在集群环境下定时器会出现并发和重复执行的问题,我再三考虑记录有5   一、把定时器模块单独拿出来放到一台tomcat或者新建一个Java工程手动启动定时器,这样定时器的任务就可以从原来的集群中抽离开来,原来的tomcat集群不再执行定时器任务,而是交给定时器应用单独执行。   二、不从集群当中抽离定时器,而是采用另外一个应用统一调度,每次只有一台tomcat执行定时器任
SpringBoot使用多实例QUARTZ出现重复执行问题
项目运行了1个多月,多实例的Quartz一直没有问题,今天突然出现一个JOB重复执行了2次。查看日志发现两个实例各执行了一次,但是是偶发现象,也就是一会执行一次,一会执行两次,没有规律。好奇怪,明明用了多实例Quartz。再次查看调度器服务的日志 2017-09-05T11:59:00+08:00 [APP/0] OUT 2017-09-05 11:59:00.004 INFO 14 --...
完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题
部署说明:   1.创建quartz集群需要的表(web/doc/tables_oracle.sql) 2.引入3个jar包+spring包 quartz-all-1.8.6.jar(web/web-inf/lib) quartz-expansion.jar(web/web-inf/lib) quartz-oracle-1.8.6.jar(web/web-inf/lib)
解决 集群 环境 定时任务 重复执行 的问题
问题描述: 公司项目,每天凌晨1点会执行一条定时任务。该任务会找到当天生日的人,并加上积分。 起初,经过开发环境,测试环境发现都没问题能够正常执行。但是到了生产环境发现,加积分 的每个人都加了4次。 原因: 生产环境用的是集群环境,一共部署到了4台服务器上,因此同一时间点,同一个定时任务 会被重复执行4次。 解决办法: 锁。 数据库新建一张表。 CREATE TABLE `t_
Quartz1.6有状态JOB碰到的棘手问题既解决方案
关于Quartz,我想不要多做介绍了,凡是接触JAVA调度的都会知道这个开源的调度框架.本文就重点说下Quartz中有状态JOB的使用心得.因为我感觉国内的有状态JOB相关的资料比较少,所以在此提供一部分个人的一点经验.主要是针对使用quartz1.6的有状态JOB可能出现的一个棘手问题. 1.关于有状态JOB(StatefulJob) 网上有很多关于有状态JOB的作用与使用的文章,我借鉴下,