我已经将我的Spring批处理配置为每当通过API调用从UI发出请求时触发作业。我面临的问题是,该作业仅在第一次和其他尝试时工作正常,每当调用时,作业不会以预期的方式响应。似乎他们正在尝试恢复,但我想再次重新启动整个执行。感谢您提前提供的任何帮助。
主要的班
@SpringBootApplication
@EnableBatchProcessing
public class HelloWorldApplication
{
public static void main(String[] args)
{
SpringApplication.run(HelloWorldApplication.class, args);
}
}
配置班
@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");
}
}
我的听众。班
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";
}
}
应用属性
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]
我希望每次发出请求时(比如第一次,即正确执行),输出都是相同的。
主要原因应该是读者Bean。然而,当你在那里提供数据时,它是一个单例。因此,一旦数据被您使用,它就不会提供任何信息。
至于解决方案,您可以使用@Scope(“prototype”)
或者使用StepScope,因为它也不是singleton。
我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中
示例:我需要处理数百万条记录,我想并行处理它们以加快处理速度。为此,我想在Executor服务中使用线程池。每项任务最多需要几秒钟。为了避免在一个线程池中为每条记录创建数百万个线程,这会导致内存问题,我决定分批处理记录。 我想为每个批使用一个新的线程池。我让Executor Service等待批处理任务完成,然后关闭Executor Service并创建一个新的Executor Service来处
我们需要执行从一个数据库到其他数据库的数据移动,并为此探索spring batch。我们应用程序的用户选择源数据源和目标数据源,以及需要为其移动数据的表列表。 在以下方面需要帮助: 构建作业所需的信息在运行时来自我们的web应用程序-包括数据源详细信息和表名列表。我们希望通过将这些详细信息发送到job builder模块来创建一个新作业,并使用JobLauncher启动它。我们如何编写这个job
想法是,如果已经运行相同的作业,则不要启动作业。 作业资源管理器是简单注入到类中,其中是用于运行的计划方法 然后它被执行 这不是解决方案,因为如果JVM在作业运行时停止,这将与当前作业运行相同: 它将找到所有带有exitCode的作业ExitStatus.UNKNOWN. 在我看来,有3种解决方案: 解决方案一: 停止以前运行的未完成作业并运行新作业PROS:一切都干净,只有一个属性 续:失去当前
我遵循了spring批处理文档,无法异步运行我的作业。 因此,我从一个web容器运行该作业,该作业将通过RESTendpoint触发。 我想让JobInstance ID在完成整个作业之前传递它作为响应。因此,他们可以稍后使用JobInstance ID检查作业的状态,而不是等待。但我没能让它工作。下面是我尝试过的示例代码。请让我知道我错过了什么或错了什么。 BatchConfig创建异步JobL
我们正在进行Spring批量工作。该作业将每天运行约6小时,并将从REST服务中获取与每条记录对应的一些值。一旦从REST服务中检索到该值,就会为相应的记录更新该值。例如。 迭代每个记录(order),并根据从REST服务中获取标记。使用检索到的标记更新列标记。REST服务不支持批处理操作,一次只能处理一条记录。 建议的解决方案: 使用以ASC顺序使用固定页面大小从数据库读取数据。由于默认情况下没