2016-08-16 85 views
3

我有一個石英工作這樣石英作業已完成,但該線程保持阻塞

@PersistJobDataAfterExecution 
@DisallowConcurrentExecution 
public class MyJob{ 

    public void execute(JobExecutionContext jec) throws JobExecutionException { 
     //connect to a FTP server, monitor directory for new files and download 
     //Using FTPClient of commons-net-3.5.jar 
    } 

作業被觸發與

JobDetail jobDetail = newJob(MyJob.class) 
    .withIdentity(jobName, DEFAULT_GROUP) 
    .usingJobData(new JobDataMap(jobProperties)) 
    .build(); 

//trigger every minute     
Trigger trigger = newTrigger() 
    .withIdentity(jobName, DEFAULT_GROUP) 
    .startNow() 
    .withSchedule(cronSchedule(cronExpression)) 
    .build(); 

scheduler.scheduleJob(jobDetail,trigger); 

作業被觸發的每一分鐘。它運行良好大約1周(10000次執行)和莫名其妙地不能重新啓動。日誌中沒有錯誤,並且看到它已經完成了以前的執行。其他進程正確啓動。

升級庫quartz-2.2.3commons-net-3.5(尋找在FTP庫中的可能的錯誤)我設法過去的3周

我有一個Job監測Scheduler寫着觸發狀態爲BLOCKED。阻止進程的Thread不是由應用服務器

TriggerState triggerState = scheduler.getTriggerState(triggerKey); 

我還沒有發現的文件上這種類型的用石英的問題,所以我懷疑是在FTP庫由石英啓動線程干擾的錯誤重複使用例如具有@PersistJobDataAfterExecution

使用我不知道這是一個衆所周知的問題,或者可能是一個錯誤這樣我就可以應用的解決方案或替代方法(殺死石英工作how to stop/interrupt quartz scheduler job manually

+0

它始終在相同的執行或時間內失敗?工作分配了哪種模式? –

+0

失敗時間在3天到3周(4300-30000次執行)之間變化,但偶爾在24h內失敗。空執行後通常會失敗:FTP連接,沒有文件,斷開連接。 cron表達式是:'0 0/1 * * *?' – pedrofb

+0

也許這個空執行會拋出任何未處理的異常或可能影響cron的錯誤?模式和工作似乎以正確的方式創建... –

回答

0

後偶有博士個月服務和OPS懷疑FTP連接錯誤阻止該服務,我們終於實現,這似乎解決問題

衡量每個流程執行現在要做的:

FTPClient ftp = new FTPClient(); 

//Added connection timeout before connect() 
ftp.setDefaultTimeout(getTimeoutInMilliseconds()); 

ftp.connect(host, port); 

//Added more timeouts to see if thread locks disappear... 
ftp.setBufferSize(1024 * 1024); 
ftp.setSoTimeout(getTimeoutInMilliseconds()); 

奇怪的是,這個過程是在connect()之前沒有被阻止,過程繼續並且沒有重新啓動而結束,但是當設置超時時,問題沒有再次發生