簡體   English   中英

Spring Quartz計划任務在一段時間后停止運行

[英]Spring Quartz scheduled task stops running after some time

我有一個在Web應用程序中運行的Quartz計時器任務。 該任務每10秒檢查數據庫中特定表中的新數據。

<bean id="triggerCheckEvents" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
    <bean id="jobCheckEvents" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="checkEvents" />
        <property name="targetMethod" value="execute" />
        <property name="concurrent" value="false" />
    </bean>
</property>
<property name="startDelay" value="${checkEvent.startDelay}" />
<property name="repeatInterval" value="${checkEvent.repeatDelay}" />

大約每隔兩天左右,計時器就會停止運行。 我可以肯定的是,它在數據庫中執行某些操作時會卡住。 但是,重新啟動數據庫似乎對恢復計時器的正常功能沒有影響。 沒有異常被拋出。 因此沒有堆棧跟蹤。

當我試圖找到根本原因時。 我認為,I / O問題注定會在長期運行的過程中發生。 因此,解決此問題的正確方法是擁有某種看門狗,例如,該看門狗將在超時后終止線程,生成新的胎面並按計划繼續運行計時器。

當任務未能在指定的時間范圍內返回時,是否可以終止計划的任務並創建新實例?

我不嘗試使用數據庫修復此特定錯誤。 因為明天其他錯誤可能會阻塞線程。 我正在尋找一個高級解決方案,該解決方案將終止進程或執行所需的任何操作以釋放被掛起的計時器線程阻塞的資源並創建一個新實例。 長期運行中不可避免的問題是不可避免的。 正確的解決方案不是研究並解決出現的單個問題,而是制定一種即使出現錯誤也能恢復正常功能的策略。

我有一個類似的問題,其中一個任務曾經被阻塞。 一種方法是:在每次調用任務時,在新線程中進行實際操作,並使任務線程等待新線程完成(直到超過最大允許時間)。 這樣,任務將永遠不會被阻塞。

    public void work(JobExecutionContext ctx) {
    Thread t = new Thread(new Runnable() {
        public void run() {
            doSomethingInNewThread();
        }
    }, "ThreadName-" + System.currentTimeMillis());
    t.start();
    try {
        t.join(maxAllowedTime);
        if (t.isAlive()) {
            logger.warn("Tasks child thread "
                    + t.getName()
                    + "is still alive, potential thread block.");
            //TBD - if needed, add logic to terminate child thread
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM