线程-quartz重复执行的问题

问题描述

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);
        }
    }

}

解决方案

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
#============================================================================

解决方案二:

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

  private static ListeningExecutorService FixedExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(FIXED_THREAD_NUM));
时间: 2024-08-03 23:37:12

线程-quartz重复执行的问题的相关文章

在 Java 应用程序中计划重复执行的任务

所有类型的 Java 应用程序一般都需要计划重复执行的任务.企业应用程序需要计划每日 的日志或者晚间批处理过程.一个 J2SE 或者 J2ME 日历应用程序需要根据用户的约定计划 闹铃时间.不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需 要的计划任务类型.在本文中,Java 开发人员 Tom White 向您展示了如何构建一个简单通 用的计划框架,以用于执行任意复杂的计划任务. 我将把 java.util.Timer 和 java.util.TimerT

spring任务调度方法重复执行2次

问题描述 spring任务调度方法重复执行2次 如题: 在使用spring任务调度时,任务的方法设置成每隔4个小时执行一次,但是现在发现这个方法在每隔4个小时执行了2次,看图. 解决方案 问题已经解决了.从网上找到一位同志的办法完美解决 . 先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml 然后修改web.xml,让web容器启动时,可以加载该文件 这样quartz只会在web容器启动时加载一次,Spring不会再加载了. web

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现

执行   上司交代要做一个小测试 具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~ 还真是费尽心思啊~最终还是被我攻克了~ 下面我就来说说具体的实现 C#提供了Mutex与Interlocked这两个与线程相关的类,都在Threading命名空间下~! Mutex中提供了WiteOne,ReleaseMutex 两个实例方法~ WiteOne的作用是"阻塞当前线程,提供对该线程的原子操作" 也就是说当一个线程遇到WiteOne的时候,如果在WiteOn

linux crontab实现在小于一分钟内重复执行

linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 创建一个php做执行动作,非常简单,就是把当前时间写入log. <?php file_put_contents('/home/fdipzone/php/crontab/run.log', date('Y-m-d H:i:s')."\r\n", FILE_APPEND); ?> crontab -e 输入以下语句,然后 :wq 保存退出.

Linux系统中重复执行命令的方法小结

  普通的重复执行命令 实际操操作过程中,经常会遇到重复执行同一命令,以观察其结果变化的情况,以前经常是上下键加回车,或是Ctr+p然后回车的方式. 现在告诉大家一个好用的命令--watch,它可以全屏执行这个命令,并显示执行结果.例如: 代码如下: #watch uptime #watch -t uptime #watch -d -n 1 netstat -ntlp #watch -d 'ls -l | fgrep goface' //监测goface的文件 #watch -t -differ

戏(细)说Executor框架线程池任务执行全过程(下)

原文链接:   首发表于infoq.com 2015年6月 上一篇文章中通过引入的一个例子介绍了在Executor框架下,提交一个任务的过程,这个过程就像我们老大的老大要找个老大来执行一个任务那样简单.并通过剖析ExecutorService的一种经典实现ThreadPoolExecutor来分析接收任务的主要逻辑,发现ThreadPoolExecutor的工作思路和我们带项目的老大的工作思路完全一致.在本文中我们将继续后面的步骤,着重描述下任务执行的过程和任务执行结果获取的过程.会很容易发现,

sql 语句在sqlite 中重复执行

问题描述 sql 语句在sqlite 中重复执行 alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00); 语句在sqlite 中怎么重复执行 解决方案 你的意思是在表TL_Init中有两列BalYear? 解决方案二: 只能多次调用exec();我之前试过,类似 String sql = ""alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00);a

延时重复执行函数 lLoopRun.js_javascript技巧

公司的一个项目中,有许多地方需要延时执行一些可重复性的函数(动作),就写了下面这段函数. 呵呵,不知道取什么意思更为确切些,就定为了:LoopRun,意为"重复执行"  function lLoopRun(sFuncLoop,sFuncEnd,nDelay) {   var vintervalId = null;   var runString  = sFuncLoop;   var stopString  = sFuncEnd;   var delayTime  = nDelay;

js定时器(执行一次、重复执行)_javascript技巧

1,只执行一次的定时器 复制代码 代码如下: <script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法 window.clearTimeout(t1);//去掉定时器 </scrip