0

I will write a code in beforeJob method of listener for downloading a file from a server into a local system D://.......After this the file which has been downloaded is a csv file , I need to pass the file name to the CustomItemReader so that I can read this file in ItemReader. Before writing the code for downloading a file, I need to know how to pass file name from beforeJob method to ItemReader? Is is possible?

public class AccountStatusChangeListener implements JobExecutionListener {

    final static Logger log = Logger.getLogger(AccountStatusChangeListener.class);

    @Autowired
    AccountStatChangDBUtil accountStatChangDBUtil;

    //Listeners will invoke before execution or after execution of Job

    public void beforeJob(JobExecution jobExecution) {
        log.debug("Invoke before starting of Job");
    }

Reader

public class AccountStatChangReader implements ItemReader<AccountStatusChangeExtract> {

    final static Logger log = Logger.getLogger(AccountStatChangReader.class);

    FlatFileItemReader<AccountStatusChangeExtract> accountStatusChangeExtractReader=null;

    String fileNameWithTimeStamp;


    public String getFileNameWithTimeStamp() {
        return fileNameWithTimeStamp;
    }

    public void setFileNameWithTimeStamp(String fileNameWithTimeStamp) {
        this.fileNameWithTimeStamp = fileNameWithTimeStamp;
    }

    //Over ride ItemReader read method
    public AccountStatusChangeExtract read() throws Exception,
    UnexpectedInputException, ParseException,
    NonTransientResourceException {
        AccountStatusChangeExtract accountStatusChangeExtract = null;

        log.debug("Inside AccountStatusChangeExtract--(read)");

        try{
            if(null==accountStatusChangeExtractReader ){
                accountStatusChangeExtractReader =new CustomAccountStatChangReader().getAccountStatusChangeItemReader(fileNameWithTimeStamp);
            }
            accountStatusChangeExtract = (AccountStatusChangeExtract) accountStatusChangeExtractReader.read();
            if(null==accountStatusChangeExtract){
                accountStatusChangeExtractReader.close();
            }
        }catch(Exception e){
            log.error("Inside AccountStatusChangeExtract--(read)--Exception--"+e);
        }

        return accountStatusChangeExtract;
    }
Satish Pahuja
  • 209
  • 1
  • 6
  • 20

1 Answers1

2

Here is what you can do,

  1. The AccountStatusChangeListener can store the value of the file name in a parameter on the JobExecutionContext

    jobExecution.getExecutionContext().put("filename", file-name)

  2. You custom item reader then implements a beforeStep(StepExecution stepExecution)

    stepExecution.getJobExecution().getExecutionContext().get("filename")

This allows you to pass data between a Job Listener and any Step Listener

Saifuddin Merchant
  • 1,071
  • 7
  • 13