quartz監控日誌(一)

2021-07-30 16:23:40 字數 2326 閱讀 8558

最近幾個月,現網總是出現定時器不執行的情況,或者定時器卡死的情況,而又不方便排查,只能依靠quartz的debug日誌以及錯誤日誌來監控定時器的執**況,並且隨著我們系統中job越來越多,而使得job問題越來越難以跟蹤,所以我們才需要乙個能過對定時器進行監控的功能,並能實現執行緒阻塞告警,以及殺死阻塞執行緒的功能。

監控job有幾種方案:

方案一:通過jmx遠端或者直接在應用內部定時獲取quartz執行資訊,可以新增、修改job、job觸發器以及執**況,但是無法對以前執行的job進行跟蹤。

方案二:在job的實現類中記錄日誌,這個方案太麻煩,因為系統目前有很多job實現類,不可能每個都去新增日誌。

方案三:**job執行類,在初始化時使用**job執行器。

最後我選擇了方案三。

先讓我們來分析下原始碼,目前只針對quartz1.6.0:

首先檢視jobrunshell類,這個是定時器的執行類實現了runnable介面,它有兩個空方法如下:

public class jobrunshell implements runnable  catch (schedulerexception se) 

//省略若干**

try catch (schedulerexception se)

}protected void begin() throws schedulerexception

protected void complete(boolean successfulexecution)

throws schedulerexception

}

很明顯,這裡預留了兩個方法來監控job的執**況。

所以我們建立了乙個其子類來**它,在開始時記錄日誌,結束時更新日誌,

public class monitorjobrunshell extends jobrunshell 

@override

protected void begin() throws schedulerexception catch (exception e) catch (throwable e)

}@override

protected void complete(boolean successfulexecution) throws schedulerexception catch (exception e) catch (throwable e)

}}

建立了該類,必須要讓quartz使用我們建立的**類,這裡quartz使用了簡單工廠模式,如下

public inte***ce jobrunshellfactory* to obtain instances of.

* */

jobrunshell borrowjobrunshell() throws schedulerexception;

}

我們只需要實現該介面,**原有的std工廠類:

public class stdjobrunshellfactoryproxy implements jobrunshellfactory

*to obtain instances of*.

* */

public jobrunshell borrowjobrunshell() throws schedulerexception

/*** * called by the

* to return instances of*.

* */

public void returnjobrunshell(jobrunshell jobrunshell)

}

進行到這裡,需要使用到我們的工廠**類,這時候則需要**入口,即stdschedule***ctory,

public class stdschedule***ctoryproxy extends stdschedule***ctory  catch (schedulerconfigexception e) 

return scheduler;

}}

最後在初始化scheduler時使用我們**的scheduler工廠類就行,例項如下:

stdschedule***ctory factory = new stdschedule***ctoryproxy();

這裡我們就實現了自己的quartz監控程式,日誌記錄方式可以自己擴充套件。這樣可以有效方便的監控job的執**況,日誌中可以記錄job的執行時長、執行緒id等,可以配置閾值如果超時可以在介面上kill該執行緒。

quartz監控日誌(三)檢視卡死執行緒堆疊

我們經常碰到一些定時任務卡死或者執行時間很長,這樣的問題我們排查手段比較常用的是jstack命令 來檢視執行緒堆疊,然後根據我們監控中的threadid或者threadname來查詢執行緒詳細堆疊看卡在哪個方法。常用命令如下 jstack pid jstack.log 現在我們可以提供介面檢視卡死執...

quartz關閉DBUG日誌

使用quartz排程任務,每次觸發任務都會輸出如下日誌,嚴重影響生產環境日誌的檢視。11 31 40.003 defaultscheduler quartzschedulerthread debug o.q.simpl.propertysettingjobfactory producing inst...

quartz關閉DBUG日誌

使用quartz排程任務,每次啟動產生大量debug日誌,機器都要被累死了。試過很多方法都不好使,包括在log4j.properties裡配置 quartz源 發現它的日誌輸出用的是slf4j,而不是log4j,所以想到用logback.xml來控制。把他的log級別改成 error。root le...