можем ли мы выполнить один и тот же тасклет, но с другим объектом за два шага в весенней партии

Я создал fileAllocationTasklet, целью которого является перемещение файла с одного пути на другой. Этот файл принимает входные данные как fromPath и To Path. Итак, я пытаюсь использовать этот же тасклет в два этапа с созданием нового объекта. Я знаю, что тасклет запускается только один раз.

@Bean
    public Step step3() {
        System.out.println("******step3 executing ");
        return stepBuilderFactory.get("step3")
                .tasklet(fileAllocationTasklet("process/data.csv","output/data.csv")).build();
    }

 @Bean
    public Step step1(JdbcBatchItemWriter<TxnDetail> writer) {
        return stepBuilderFactory.get("step1")
                .tasklet(fileAllocationTasklet("initial/data.csv","process/data.csv")).build();
    }

@Bean
    public Tasklet fileAllocationTasklet(String fromPath,String toPath) {
        FileAllocationTasklet fileAllocation = new FileAllocationTasklet();
        fileAllocation.setFromPath(fromPath);
        fileAllocation.setToPath(toPath);
        return fileAllocation;
    }

Но тасклет запускается только первый раз на шаге 1, но не запускается на шаге 3. Я сделал это, чтобы у меня не было избыточности в коде. Если есть другой лучший подход, то он будет заметен.

На самом деле ответ на этот вопрос я использовал @StepScope, что означает, что объект будет уникальным для каждого шага, но не одноэлементным. При выполнении каждого временного шага будет формироваться новый объект тасклета, который ранее не формировался из-за @Bean. Объяснение также доступно в https://stackoverflow.com/questions/38780796/how-does-spring-batch-step-scope-work?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa


person dj Bravo    schedule 18.04.2018    source источник


Ответы (1)


Я не совсем уверен, чего вы пытаетесь достичь. Я помещаю здесь код, чтобы убедиться, что мы понимаем на одной странице. И извините, у меня нет примера проекта для аннотации, так что здесь конфигурация XML.

Конфигурация задания

<job id="exampleJobTask" xmlns="http://www.springframework.org/schema/batch">
        <step id="stepOne" next="stepTwo">
            <tasklet ref="performTaskTaskOne"/>
        </step>

        <step id="stepTwo">
            <tasklet ref="performTaskTaskTwo"/>
        </step>
    </job>

Конфигурация компонента

<bean id="performTaskTaskOne" class="com.itservicesdepot.example.springbatch.tasklet.PerformTask" scope="step">
        <property name="from" value="initial/data.csv" />
        <property name="to" value="process/data.csv" />
    </bean> 

    <bean id="performTaskTaskTwo" class="com.itservicesdepot.example.springbatch.tasklet.PerformTask" scope="step">
        <property name="from" value="process/data.csv" />
        <property name="to" value="output/data.csv" />
    </bean>

Тестовый класс

package com.itservicesdepot.example.springbatch;

import java.util.Date;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.StopWatch;

import junit.framework.Assert;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:example-jobs.xml"})
public class ShowCaseTest {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    @Qualifier(value = "exampleJobTask")
    private Job exampleJobTask;

    @Test
    public void exampleJobTask() throws Exception {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        JobExecution jobExecution = jobLauncher.run(this.exampleJobTask,
                new JobParametersBuilder()
                        .addDate("now", new Date()).toJobParameters());

        stopWatch.stop();

        Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
    }
}

Пожалуйста, просмотрите и дайте мне знать, чего вы хотите достичь.

Спасибо,

person Nghia Do    schedule 18.04.2018
comment
Я добавил @StepScope, теперь он работает, спасибо за ваш ответ. - person dj Bravo; 19.04.2018
comment
здорово видеть, что это помогает - person Nghia Do; 19.04.2018