Доступ к информации о работе для MDC - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь зарегистрировать информацию о работе в MDC. У меня есть файл с именем CommonBatchConfiguration, который обрабатывает потоки и регистрирует информацию о заданиях. Я хочу регистрировать такие вещи, как jobName и executionId для любой работы, которая может быть запущена.

У меня есть такой лаунчер:

@Bean(name = "AsyncMccJobLauncher")
    public JobLauncher simpleJobLauncher(JobRepository jobRepository) {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
        taskExecutor.setTaskDecorator(new TaskDecorator() {

            @Override
            public Runnable decorate(Runnable runnable) {
//                MDC.put("execId", jobExecution.getJobId());
//                MDC.put("jobName", "test jobName");

                return new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        // This adds batch logging info while the job is running
//                        MDC.put("execId", "here");
//                        MDC.put("jobName", "here");
                        runnable.run();
                    }
                };
            }
        });
        jobLauncher.setTaskExecutor(taskExecutor);
        return jobLauncher;
    }

как я могу получить доступ к информации о работе здесь? Когда я пытаюсь использовать JobExecution, он всегда возвращается в ноль

1 Ответ

0 голосов
/ 04 сентября 2018

Выполнение задания должно быть уже создано при вызове вашего декорированного запуска. Вопрос в том, как получить к нему доступ на данный момент? Я не уверен, что это будет легко, если только вы не сможете проанализировать конечную переменную в методе экземпляра анонимного внутреннего класса (исполняемый файл, созданный Spring Batch), обернутого в экземпляр анонимного внутреннего класса ( ваш декоратор): -)

Я хочу регистрировать такие вещи, как jobName и executeId, для любой работы, которая может выполняться.

Возможно, вам не нужен декоратор задач. То, что вы можете сделать, это подкласс SimpleJobLauncher и переопределить run, что-то вроде:

@Bean(name = "AsyncMccJobLauncher")
public JobLauncher simpleJobLauncher(JobRepository jobRepository) {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher() {
        @Override
        public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
            JobExecution jobExecution = super.run(job, jobParameters);
            // jobExecution is created and accessible here
            //MDC.put("execId", String.valueOf(jobExecution.getJobId()));
            //MDC.put("jobName", jobExecution.getJobInstance().getJobName());
            return jobExecution;
        }
    };
    jobLauncher.setJobRepository(jobRepository);
    SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
    jobLauncher.setTaskExecutor(taskExecutor);
    return jobLauncher;
}
...