Quartz 2.2.1,JMX jobruntime总是-1?

时间:2017-06-23 13:55:54

标签: quartz

在Quartz中,对于JMX属性CurrentlyExecutingJobs =>是否正常? [item] => jobRunTime在当前运行时始终为“-1”,或者在Quartz中是否有一些设置以确保jobRunTime正确更新?

(通过jconsole,Mission Control和jmx代码确认)

Usecase用于跟踪/监视长时间运行的作业,并认为jobRunTime是适当的路径。替代路径是“fireTime”+ CURRENT_NOW计算,但是如果它已经发生在某处,则希望避免额外的计算。

1 个答案:

答案 0 :(得分:0)

追逐此后,如果不手动设置此特定值,则不会更新。查看监视Quartz作业的工具,例如Javamelody,他们每次都必须计算它:

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

如果要手动更新长时间运行的作业的jobruntime值以检查值而不是在外部计算它,则必须更改每个作业以支持此功能。以下是一个粗略的示例,可根据您的需求进行修改: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() + "]" );
    }

}`