当前位置: 首页 > 知识库问答 >
问题:

带有任务执行器的Spring Batch Tasklet

鲍永春
2023-03-14

关于spring batch tasklet与Task-Executor的步骤,我遇到了一个奇怪的问题。配置是正常和简单的,只是一个tasklet(不是面向块的),如下所示:

<batch:job id="MyJob" restartable="false">
        <batch:step id="MyJob.Step1">
            <batch:tasklet ref="someBean" task-executor="simpleAsyncTaskExecutor" throttle-limit="1"/>
        </batch:step>
</batch:job>

someBean是一个实例实现的Tasklet接口。stange的问题是,当我启动作业时,execute方法调用了两次:

@Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    // some logic and no exception

    return RepeatStatus.FINISHED;
}

实际上,创建了两个线程,并执行了两次该逻辑。如果将task-executor更改为普通的task-executor=“synctaskexecutor”(org.springframework.core.task.synctaskexecutor),则只创建一个线程并调用execute()一次。

有人遇到这个案子并能给出一些想法吗?我真的不知道“谁”和“什么时候”创建了两个线程?谢谢

共有1个答案

萧光华
2023-03-14

当指定异步任务执行器时,tasklet将由多个线程并发执行。该限制可以使用节流限制设置,它的默认值为4。在您的情况下,两个线程将执行该任务。

另一方面,SyncTaskExecutor将在调用线程中运行tasklet,这意味着只运行一次,因为没有创建其他线程。

 类似资料:
  • 我有一个文件列表和一个分析这些文件的分析器列表。文件数量可以很大(200,000),分析器数量可以很大(1000)。所以操作总数可能非常大(200,000,000)。现在,我需要应用多线程来加快速度。我采用了这种方法: 但这种方法的问题是,它占用了太多的内存,我想有更好的方法可以做到这一点。我还是java和多线程的初学者。

  • 我想写一个Gradle任务,在我所有的子项目中共享。此任务在调用它的子项目中查找所有其他类型为“GenerateMavenPom”的任务,并执行这些任务。 通过这样做,我的子项目可以定义他们想要的任何Maven发布,我可以使用“gradle GenerateMavenPomFiles”等单个任务执行gradle来创建pom.xml,而不需要知道每个子项目中的单个发布类型。为什么?因为Maven插件

  • 我无法找到必要的信息,无论是在文档中还是在这里已经存在的问题中,这就是为什么我自己创建了一个(我还不能在类似的帖子下提问)。 我需要知道的是Spring任务执行器和调度器之间的关系。我当前的配置如下所示: 我不确定的是它是如何工作的。“谁”运行我的任务?是调度器,因为任务是和他一起安排的吗?或者调度器只是创建它们,放在队列中,由执行者运行它们? 如果没有,运行的是scheduler,我必须在特定类

  • 我检查了其他几个类似的问题,但没有找到解决方案。 因此,我有一个配置了web服务的spring boot项目: ServiceImpl,例如: 服务运行良好。 我的POM实现如下所示: 主要类别: 到目前为止,一切都很好-WS是可达的,但如果我添加到POM: 应用程序启动,我可以在日志中看到: endpoint处理程序映射:映射”{[/info EndpointHandlerMapping:映射的

  • 我是Apache Flink的新手,所以我目前正在尝试做一些实验。我正在读Kafka的一个主题,然后在控制台上打印出来。打印大约100kkafka消息后,它抛出异常。日志输出如下。 我正在使用一个自定义类来扩展AbstractDeserializationSchema,以反序列化kafka记录值。我甚至尝试过在其中添加一些异常处理,但没有触发。 我使用Kafka的代码非常简单: 即使在异常之后,输