2017-06-23 1 views
0

Ist es normal, dass in Quartz für das JMX-Attribut CurrentExecutingJobs => [item] => jobRunTime immer "-1" ist, während es gerade ausgeführt wird, oder gibt es eine Einstellung in Quartz, um sicherzustellen, dass jobRunTime entsprechend aktualisiert wird?Quarz 2.2.1, JMX JobRuntime immer -1?

(bestätigt durch jconsole, Mission Control und JMX-Code)

Usecase ist zu verfolgen/überwachen lang laufende Aufträge und dachte jobRunTime der entsprechende Weg sein würde. Der alternative Pfad ist "fireTime" + CURRENT_NOW Berechnung, wollte aber zusätzliche Berechnungen vermeiden, wenn sie bereits irgendwo vorkamen.

Antwort

0

Nach diesem Vorgang wird dieser bestimmte Wert nicht aktualisiert, ohne dass er manuell festgelegt wird. Überprüfen von Werkzeugen, die Quarz-Jobs überwachen, wie Javamelody, haben sie es auch jedes Mal berechnen:

elapsedTime = System.currentTimeMillis()- quartzAdapter.getContextFireTime(jobExecutionContext).getTime(); 

Wenn Sie für den jobruntime Wert manuell aktualisieren lang laufende Aufträge eher um den Wert zu überprüfen, als es außerhalb der Berechnung , müssen Sie jeden Job ändern, müssen Sie diese Funktion unterstützen. Hier ist ein grobes Beispiel, das für Ihre Bedürfnisse geändert werden kann: https://github.com/dhartford/quartz-snippets/blob/master/update_jobruntime_timer_innerclass

/** 
* inner class to handle scheduled updates of the Quartz jobruntime attribute 
*/ 
class UpdateJobTimer extends TimerTask{ 
    private JobExecutionContextImpl jec; 
    /* usage example, such as at the start of the execute method of the Job interface: 
    * Timer timer = new Timer(); 
    * //update every 10 seconds (in milliseconds), whatever poll timing you want 
    * timer.schedule(new UpdateJobTimer(jec), 0, 10000); 
    * ... 
    * timer.cancel(); //do cleanup in all appropriate spots 
    */ 

    UpdateJobTimer(JobExecutionContextImpl jec){ 
     this.jec = jec; 
    } 

    @Override 
    public void run() { 
     long runtimeinms = jec.getFireTime().getTime() - new java.util.Date().getTime(); 
     jec.setJobRunTime(runtimeinms); 
     System.out.println("DEBUG TIMERTASK on JOB: " + jec.getJobDetail().getKey().getName() + " triggered [" + jec.getFireTime() + "] updated [" + new java.util.Date() + "]"); 
    } 

}`