【问题标题】:Log Caller Class/Job Context When Spring Quartz Task ExecuteSpring Quartz 任务执行时记录调用者类/作业上下文
【发布时间】:2020-07-03 08:46:00
【问题描述】:

我正在编写一个 java/spring 库以包含在使用石英的其他项目中。 每次执行作业时,我都需要它来记录有关任务/调用类的一些信息。

例如,如果石英作业如下所示:

@Bean
public JobDetail jobADetail() {
    return JobBuilder.newJob(QuartzTaskA.class)
            .withIdentity("sampleJobA")
            .storeDurably().build();
}

@Bean
public Trigger jobATrigger(JobDetail jobADetail) {
    return TriggerBuilder.newTrigger()
            .forJob(jobADetail)
            .withIdentity("sampleTriggerA")
            .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * ? * * *"))
            .build();
}

public class QuartzTaskA implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        log.info("QuartzA - the time is now {}", dateFormat.format(new Date()));
    }
}

我希望它记录如下内容:

Job [QuartzTaskA] with details [sampleJobA] and trigger [sampleTriggerA] is starting
QuartzA - the time is now 12:07:39

我使用自定义 TaskExecutor 自定义 SchedulerFactoryBean,该 TaskExecutor 在 task.run() 之前执行日志。 这行得通,我可以打印额外的第一行,但我不知道如何将详细信息/上下文传递到日志中。

@Configuration
public class SchedulerFactoryCustomizer implements SchedulerFactoryBeanCustomizer {
    private static final Logger log = LogManager.getLogger(SchedulerFactoryCustomizer.class);

    @Override
    public void customize(SchedulerFactoryBean schedulerFactoryBean) {
        Executor executor = SchedulerFactoryBean.getConfigTimeTaskExecutor();
        schedulerFactoryBean.setTaskExecutor(new CustomExecutor(executor);
    }

    private static class CustomExecutor implements Executor {
        final Executor executor;

        private CustomExecutor(Executor executor) {
            this.executor = executor;
        }

        @Override
        public void execute(Runnable task) {
            // This line here. How can I get the details/context to pass in?
            //log.info("Job {} with details {} and trigger {} is starting");
            task.run();
        }
    }
}

如何获取详细信息/上下文以传递到日志中?

【问题讨论】:

    标签: java spring quartz-scheduler scheduling executorservice


    【解决方案1】:

    你可以实现一个 JobListener/TriggerListener

    public class LoggingTriggerListener implements TriggerListener {
    
        @Override
        public String getName() {
    
            return null;
        }
    
        @Override
        public void triggerFired(final Trigger trigger, final JobExecutionContext context) {
    
        }
    
        @Override
        public boolean vetoJobExecution(final Trigger trigger, final JobExecutionContext context) {
    
            return false;
        }
    
        @Override
        public void triggerMisfired(final Trigger trigger) {
    
        }
    
        @Override
        public void triggerComplete(final Trigger trigger, final JobExecutionContext context, final Trigger.CompletedExecutionInstruction triggerInstructionCode) {
    
        }
    }
    
    

    它也注入了 jobExecutionContext。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多