Как перезапускать мое пакетное задание каждый раз, когда я запрашиваю средство запуска задания для создания нового задания - PullRequest
0 голосов
/ 23 мая 2019

Я настроил свой весенний пакет на запуск заданий всякий раз, когда из интерфейса пользователя поступает запрос через вызовы API.Проблема, с которой я сталкиваюсь, заключается в том, что работа работает нормально только в первый раз, а для других попыток, когда звонки сделаны, задания не отвечают ожидаемым образом.Похоже, они пытаются возобновить, но я хочу перезапустить все выполнение снова.Спасибо за любую помощь заранее.

Main.class

@SpringBootApplication
@EnableBatchProcessing
public class HelloWorldApplication 
{
    public static void main(String[] args) 
    {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

configuration.class

@Configuration
public class ListenerJobConfiguration 
{
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public ItemReader<String> reader()
    {
        return new ListItemReader<>
        (Arrays.asList("one","two","three"));
    }

    @Bean
    public ItemWriter<String> writer()
    {
        return new ItemWriter<String>() 
        {
            @Override
            public void write(List<? extends String> items) throws Exception 
            {
                for(String item:items)
                {
                    System.out.println("writing items "+item);
                }               
            }
        };
    }   

    @Bean
    public Step step1()
    {
        return stepBuilderFactory.get("step1")
                .<String,String>chunk(2)
                .faultTolerant()
                .listener(new ChunkListener())
                .reader(reader())
                .writer(writer())
                .build();       
    }

    @Bean
    public Job listenerJob()
    {
        return jobBuilderFactory.get("listenerJob"+new Date())
                .start(step1())
                .listener(new JobListener())
                .build();
    }

}

JobListener.class

public class JobListener implements JobExecutionListener 
{

    @Override
    public void beforeJob(JobExecution jobExecution) 
    {
        System.out.println("Before job");
    }

    @Override
    public void afterJob(JobExecution jobExecution) 
    {
        System.out.println("After job");    
    }

}

ChunkListener.class

public class ChunkListener 
{
    @BeforeChunk
    public void  beforeChunk(ChunkContext context)
    {
        System.out.println(">>  Before the chunk");
    }

    @AfterChunk
    public void afterChunk(ChunkContext context)
    {
        System.out.println("<<  After the chunk");
    }

}

Controller.class

@RestController
public class BatchController 
{

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher")
    public void handle() throws Exception 
    {
        JobParametersBuilder builder = new JobParametersBuilder();
        builder.addDate("date", new Date());
        jobLauncher.run(job, builder.toJobParameters());
    }

    @GetMapping(value = "/test")
    public String test() 
    {
        return "test success";
    }

}

application.properties

spring.batch.job.enabled=false

Ответ при первом запросе API

2019-05-24 01:03:53.578  INFO 5264 --- [nio-9999-exec-1] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=listenerJobFri May 24 01:03:42 IST 2019]] launched with the following parameters: [{date=1558640033401}]
Before job
2019-05-24 01:03:53.640  INFO 5264 --- [nio-9999-exec-1] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
>>  Before the chunk
writing items one
writing items two
<<  After the chunk
>>  Before the chunk
writing items three
<<  After the chunk
After job
2019-05-24 01:03:53.722  INFO 5264 --- [nio-9999-exec-1] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=listenerJobFri May 24 01:03:42 IST 2019]] completed with the following parameters: [{date=1558640033401}] and the following status: [COMPLETED]

Ответ в другое время

2019-05-24 01:05:02.072  INFO 5264 --- [nio-9999-exec-4] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=listenerJobFri May 24 01:03:42 IST 2019]] launched with the following parameters: [{date=1558640102047}]
Before job
2019-05-24 01:05:02.107  INFO 5264 --- [nio-9999-exec-4] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
>>  Before the chunk
<<  After the chunk
After job
2019-05-24 01:05:02.150  INFO 5264 --- [nio-9999-exec-4] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=listenerJobFri May 24 01:03:42 IST 2019]] completed with the following parameters: [{date=1558640102047}] and the following status: [COMPLETED]

Я хочу, чтобы вывод был одинаковым каждый раз (как в первый раз, т.е. при правильном выполнении) всякий раз, когда сделан запрос.

1 Ответ

0 голосов
/ 23 мая 2019

Основной причиной должен быть Reader Bean.Тем не менее, поскольку вы предлагаете данные там, это единственный.Так что он ничего не предлагает, как только данные были использованы вами.

Что касается решения, вы можете использовать @Scope («прототип»)

или использовать StepScope , поскольку он также не является синглтоном.

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