2015-04-29 3 views
3

Я пишу весеннюю партию. Но когда этот класс Archive, который внедряет интерфейс таска в загружаемый, метод под аннотацией @BeforeStep не вызывается. Кто-нибудь может мне с этим помочь ? Спасибо@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(); 

     } 
    } 
+0

Как вы настройки слушателя? –

ответ

4

Первое решение может извлечь из ExecutionContextexecute метода, где у вас есть ChunkContext и делать с ней все, что вам нужно.

ExecutionContext jobContext = chunkContext.getStepContext() 
            .getStepExecution() 
            .getJobExecution() 
            .getExecutionContext(); 

Второе решение может быть реализовать 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(); 
    } 
} 

У меня была схожая проблема, и мы с ней разобрались. Что касается того, почему @BeforeStep не вызывается на тасклете, но он находится внутри readers, processors и writers Я не уверен.

10

Третье решение:: вы, вероятно, не зарегистрировали свой тасклет в качестве слушателя, поэтому аннотированный метод не вызывается с самого начала. Вы можете предоставить тасклет ссылку как слушателя в работе определения XML, как это:

<job id="yourJob" > 
    <step id="step1"> 
      <tasklet ref="archive"> 
       <listeners> 
        <listener ref="archive" /> 
       </listeners> 
      </ 
     </step> 
</job> 

вы также должны аннотировать архивировать класс с:

@Component("archive") 
@Scope("step") 
+1

Основываясь на теме «@BeforeStep аннотированный метод, который не называется», я считаю, что это истинный ответ. Задачи автоматически не регистрируются в качестве слушателя. – DBK

+0

Это истинный ответ: он дает точную информацию, необходимую OP. – lpratlong

Смежные вопросы