복붙노트

[SPRING] MDC에 대한 작업 정보를 액세스

SPRING

MDC에 대한 작업 정보를 액세스

나는 MDC와 직업 정보를 기록하기 위해 노력하고있어. 나는 스레딩 및 로깅 작업 정보를 처리라는 파일 CommonBatchConfiguration 있어요. 나는 실행할 수있는 작업에 대한 작업 이름과 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를 사용하려고하면 항상 널 (null)까지 제공

해결법

  1. ==============================

    1.당신의 장식 실행 가능한가 호출 될 때 작업 실행이 이미 만들어야합니다. 문제는이 시점에서에 접근하는 방법은? 당신은 익명의 내부 클래스 인스턴스의 방법 익명의 내부 클래스 인스턴스 (당신의 장식)에 싸여 (스프링 배치에 의해 생성 된 실행 가능)에서 최종 변수를 성찰 할 수 있습니다하지 않는 한이 :-) 쉬운 것입니다 있는지 확실하지 않습니다

    당신의 장식 실행 가능한가 호출 될 때 작업 실행이 이미 만들어야합니다. 문제는이 시점에서에 접근하는 방법은? 당신은 익명의 내부 클래스 인스턴스의 방법 익명의 내부 클래스 인스턴스 (당신의 장식)에 싸여 (스프링 배치에 의해 생성 된 실행 가능)에서 최종 변수를 성찰 할 수 있습니다하지 않는 한이 :-) 쉬운 것입니다 있는지 확실하지 않습니다

    당신은 아마 작업 장식을 가질 필요가 없습니다. 당신이 할 수있는 것은 서브 클래스 SimpleJobLauncher 및 재정의 실행, 같은 것입니다 :

    @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;
    }
    
  2. from https://stackoverflow.com/questions/52171559/accessing-job-information-for-mdc by cc-by-sa and MIT license