Spring 如何从rest服务启动批处理。afterJob运行,但EnableBatchProcessing仅在部署后运行

Spring 如何从rest服务启动批处理。afterJob运行,但EnableBatchProcessing仅在部署后运行,spring,spring-mvc,spring-boot,spring-batch,Spring,Spring Mvc,Spring Boot,Spring Batch,我遵循的教程基本上是读取电子表格,并在应用程序启动后将数据插入数据库。我想在每次调用rest服务时执行读取过程,所以我在这个应用程序中添加了一个控制器。为了调用该作业,我遵循了中的建议,现在它提出了我的问题:每当我调用rest服务时,它只运行afterJob方法。我读到了一篇与我的问题有一定相似之处的文章,以及文章中提到的优秀博客文章,但我仍然被卡住了。我想在rest服务之后调用PublicItemReader,我希望应用程序通过main启动时遵循相同的流程。我的意思是,与springboot部

我遵循的教程基本上是读取电子表格,并在应用程序启动后将数据插入数据库。我想在每次调用rest服务时执行读取过程,所以我在这个应用程序中添加了一个控制器。为了调用该作业,我遵循了中的建议,现在它提出了我的问题:每当我调用rest服务时,它只运行afterJob方法。我读到了一篇与我的问题有一定相似之处的文章,以及文章中提到的优秀博客文章,但我仍然被卡住了。我想在rest服务之后调用PublicItemReader,我希望应用程序通过main启动时遵循相同的流程。我的意思是,与springboot部署时的流程相同。我想我的困惑在于@EnableBatchProcessing或JobExecutionListenerSupport,但我真的被困在这上面了。 下面是最重要的片段

控制器

听众

批量配置


在深入讨论这个问题之后,真正的问题是ItemReader只创建了一次,而不是每次REST调用创建一次,也就是每次执行作业创建一次。要解决此问题,请设置ItemReader步骤的作用域。这将允许您在每次运行时获得读取器的一个新实例,这还允许根据作业参数注入文件名

从代码的角度,更改以下内容:

@Bean
public ItemReader<Person> reader() {
为此:

@Bean
@StepScope
public FlatFileItemReader<Person> reader() {

返回类型更改的原因是Spring Batch将自动为您注册ItemStreams。但是,当使用@StepScope时,我们只看到您定义的返回。在本例中,ItemReader不扩展/实现ItemStream,因此我们不知道您正在返回我们应该自动注册的内容。通过返回FlatFileItemReader,我们可以看到所有接口/etc,并可以为您应用魔法。

在深入讨论这个问题后,真正的问题是ItemReader将被创建一次,而不是每次REST调用一次,也就是每次执行作业一次。要解决此问题,请设置ItemReader步骤的作用域。这将允许您在每次运行时获得读取器的一个新实例,这还允许根据作业参数注入文件名

从代码的角度,更改以下内容:

@Bean
public ItemReader<Person> reader() {
为此:

@Bean
@StepScope
public FlatFileItemReader<Person> reader() {

返回类型更改的原因是Spring Batch将自动为您注册ItemStreams。但是,当使用@StepScope时,我们只看到您定义的返回。在本例中,ItemReader不扩展/实现ItemStream,因此我们不知道您正在返回我们应该自动注册的内容。通过返回FlatFileItemReader,我们可以看到所有接口/etc,并可以为您应用魔法。

您不使用Spring Batch Admin通过REST启动作业有什么原因吗?如果我理解正确,您建议我删除Spring引导,改为使用Spring Batch Admin。老实说,这是我第一次使用SpringBatch,因此,如果你能指出与我尝试的方法不同的方法的优点,或者你能指出我的方法中的奇怪之处,我将非常感激。虽然上面有一个简单的例子,但我准备在下个月替换cobol完成的重要工作,所以我必须非常自信。所有批处理都将在大型机中运行,因此我发现Spring boot的目的非常有趣,因为它可以提供一个嵌入式tomcat plus Spring批处理功能。不完全是这样。您可以同时使用Spring引导和Spring批处理管理。看看我看到的这个例子,但不清楚它将如何解决我的问题。我不能向我公司的最终用户公开Spring批处理管理。批处理属于应用程序A域,它们将在用户在应用程序B中执行某些工作流后启动,例如,应用程序B将从应用程序A调用rest web服务,并发送已填写的pojo,然后,rest服务必须调用批处理。angular示例的java部分将代表应用程序A。它包含作业和rest服务。应用程序B会调用它发送启动请求。您不使用Spring Batch Admin通过REST启动作业有什么原因吗?如果我理解正确,您建议我删除Spring引导,改用Spring Batch Admin。老实说,这是我第一次使用SpringBatch,因此,如果你能指出与我尝试的方法不同的方法的优点,或者你能指出我的方法中的奇怪之处,我将非常感激。虽然上面有一个简单的例子,但我准备在下个月替换cobol完成的重要工作,所以我必须非常自信。所有批处理都将在大型机中运行,因此我发现Spring boot的目的非常有趣,因为它可以提供一个嵌入式tomcat plus Spring批处理功能。不完全是这样。您可以同时使用Spring引导和Spring批处理管理。看看我看到的这个例子,但不清楚它将如何解决我的问题。我不能向我公司的最终用户公开Spring批处理管理。批属于应用程序A和d
omain,当用户在应用程序B中执行某些工作流后,它们将启动。例如,应用程序B将从应用程序a调用rest web服务,并发送已填写的pojo,然后,rest服务必须调用批处理。angular示例的java部分将代表应用程序a。它包含作业和rest服务。应用程序B将调用它发送启动请求。最后一个问题,我是否应该担心每次运行都会得到一个新的读卡器实例?我的意思是,当我在制作中发表这篇文章时,有什么陷阱吗?我的意思是,我应该杀掉每一个实例吗?不。每个实例都应该在适当的时间进行垃圾收集。最后一个问题是,我应该担心每次运行都会得到一个新的读卡器实例吗?我的意思是,当我在制作中发表这篇文章时,有什么陷阱吗?我的意思是,我应该杀掉每一个实例吗?不。应在适当的时间对每个实例进行垃圾收集。
@Bean
public ItemReader<Person> reader() {
@Bean
@StepScope
public FlatFileItemReader<Person> reader() {