@BeforeStep没有被调用的注释方法

Dhe*_*raj 6 spring-batch

我正在写一个春季批处理工作.但是当这个Archive类在加载时实现了tasklet接口时,注释@BeforeStep下的方法没有被调用.谁能帮我这个 ?谢谢

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus;


    public class Archive implements Tasklet{
        @Override
        public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
                throws Exception {

            System.out.println("in execute method :)");
            return RepeatStatus.FINISHED;
        }

        @BeforeStep
        public void retrieveInterstepData(StepExecution stepExecution){
            JobExecution jobExecution = stepExecution.getJobExecution();
            ExecutionContext jobContext = jobExecution.getExecutionContext();

        }
    }
Run Code Online (Sandbox Code Playgroud)

gui*_*ama 13

一个第三个解决方案做到这一点:你可能不注册你的任务蕾作为一名听众这样注释的方法是不是从一开始叫.您可以在作业xml定义中将tasklet引用作为侦听器提供,如下所示:

<job id="yourJob" > 
    <step id="step1">
            <tasklet ref="archive">
                <listeners>
                    <listener ref="archive" />
                </listeners>
            </
        </step>
</job> 
Run Code Online (Sandbox Code Playgroud)

你还必须用以下内容注释Archive类:

@Component("archive")
@Scope("step")
Run Code Online (Sandbox Code Playgroud)


Nen*_*zic 7

第一种解决方案可以是ExecutionContextexecute您拥有ChunkContext和使用它的方法中提取,无论您需要什么.

ExecutionContext jobContext = chunkContext.getStepContext()
                                    .getStepExecution()
                                    .getJobExecution()
                                    .getExecutionContext();
Run Code Online (Sandbox Code Playgroud)

第二种解决方案可以是实现StepExecutionListener和覆盖beforeStep方法.你会有类似的东西:

public class Archive implements Tasklet, StepExecutionListener{
    @Override
    public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
                throws Exception {
        System.out.println("in execute method :)");
        return RepeatStatus.FINISHED;
    }

    @Override
    public void beforeStep(final StepExecution stepExecution) {
        JobExecution jobExecution = stepExecution.getJobExecution();
        ExecutionContext jobContext = jobExecution.getExecutionContext();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了类似的问题,我们就这样克服了它.至于为什么@BeforeStep不叫上微进程,但它里面readers,processorswriters我不知道.