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

Spring Batch JobInstance可以多次运行

景理
2023-03-14

我是Spring Batch的新手,相信我,那天我读了很多关于它的东西,试图熟悉它的概念。我对JobInstanceRunidIncrementerJobParamaters是如何工作的有点困惑,我想了解一些方面:

  • 当您运行一个作业,并且JobInstance名称已经在Batch_Job_Instance表中时,该作业不会启动。那么,为我的JobInstance生成新名称的最佳方法是什么?
  • 当我要启动我的作业时,总是生成一个新名称是一种好的做法吗?
  • 因为作业应该计划运行多次。创建一个批处理(作业)的最佳实践是什么,该批处理(作业)计划运行多次而不生成新名称?
  • RunIdIncrementer()是否应该创建id来生成新的工作名?

编辑:请参见下面的代码

@Bean
public Job batchExecution() {

    return jobs
            .get("BatchJob")
            .incrementer(new JobIdIncrementer())
            .start(downloadFile())
            .next(archiveFile())
            .next(readFile())
            .build();
}

JobIdIncrementer:

public class JobIdIncrementer implements JobParametersIncrementer {

    private static String RUN_ID_KEY = "run.id";
    private String key;

    public JobIdIncrementer() {
        this.key = RUN_ID_KEY;
    }

    public void setKey(String key) {
        this.key = key;
    }

    @Override
    public JobParameters getNext(JobParameters parameters) {
        JobParameters params = parameters == null ? new JobParameters() : parameters;
        long id = new Date().getTime();
        return (new JobParametersBuilder(params)).addLong(this.key, Long.valueOf(id)).toJobParameters();
    }
}
.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)

"2018-08-08 15:36:03 - Starting Application on MA18-012.local with PID 39543 
""2018-08-08 15:36:05 - HikariPool-1 - Starting...
""2018-08-08 15:36:05 - HikariPool-1 - Start completed.
""2018-08-08 15:36:06 - HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
""2018-08-08 15:36:06 - HHH000412: Hibernate Core {5.2.14.Final}
""2018-08-08 15:36:06 - HHH000206: hibernate.properties not found
""2018-08-08 15:36:06 - HHH80000001: hibernate-spatial integration enabled : true
""2018-08-08 15:36:06 - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
""2018-08-08 15:36:06 - HHH000400: Using dialect: org.hibernate.spatial.dialect.mysql.MySQL5SpatialDialect
""2018-08-08 15:36:06 - HHH000400: Using dialect: org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect
""2018-08-08 15:36:09 - Started Application in 6.294 seconds (JVM running for 6.812)
""2018-08-08 15:36:09 - Loading the file name
""2018-08-08 15:36:23 - Downloading the file
""2018-08-08 15:36:24 - Archiving the file 
""2018-08-08 15:36:24 - Unzipping the file
""2018-08-08 15:36:24 - Removing the file
""2018-08-08 15:36:51 - Reading the file
""2018-08-08 15:36:52 - HHH000397: Using ASTQueryTranslatorFactory
""2018-08-08 15:36:54 - HikariPool-1 - Shutdown initiated...
""2018-08-08 15:36:54 - HikariPool-1 - Shutdown completed.
.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)

"2018-08-08 15:38:28 - Starting Application on MA18-012.local with PID 39638
""2018-08-08 15:38:28 - No active profile set, falling back to default profiles: default
""2018-08-08 15:38:30 - HikariPool-1 - Starting...
""2018-08-08 15:38:30 - HikariPool-1 - Start completed.
""2018-08-08 15:38:30 - HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
""2018-08-08 15:38:30 - HHH000412: Hibernate Core {5.2.14.Final}
""2018-08-08 15:38:30 - HHH000206: hibernate.properties not found
""2018-08-08 15:38:30 - HHH80000001: hibernate-spatial integration enabled : true
""2018-08-08 15:38:30 - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
""2018-08-08 15:38:31 - HHH000400: Using dialect: org.hibernate.spatial.dialect.mysql.MySQL5SpatialDialect
""2018-08-08 15:38:31 - HHH000400: Using dialect: org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect
""2018-08-08 15:38:33 - Started Application in 6.376 seconds (JVM running for 6.873)
""2018-08-08 15:38:34 - HikariPool-1 - Shutdown initiated...
""2018-08-08 15:38:34 - HikariPool-1 - Shutdown completed.

共有1个答案

隆礼骞
2023-03-14

当您运行一个作业并且JobInstance名称已经在BATCH_JOB_INSTANCE表中时,该作业不会启动。那么,为我的JobInstance生成新名称的最佳方法是什么?

您不需要每次都更改作业名称。您的作业可以有多个作业实例,每个实例由一个键标识,该键是用于运行作业的(标识)作业参数的哈希值。

当我要启动我的工作时,总是生成一个新的名称是一个好的做法吗?

不,您不需要生成新的名称(这是同一个作业,所以名称不应更改)。您需要做的是每次通过指定不同的作业参数来创建一个新的作业实例。

因为作业应该被安排运行多次。创建要调度运行多次而不生成新名称的批处理(作业)的最佳实践是什么?

根据职务的频率,可以将日期添加为职务参数。例如,如果您的作业计划每天运行,则当前日期是一个很好的参数。查看文档的这一部分:https://docs.spring.io/spring-batch/4.0.x/reference/html/domain.html#job它提供了一个示例。

RunIdIncrementer()是否应该创建一个id来生成一个新的JobName?

runidincrementer递增run.id作业参数,这样就可以获得jobparameters的新实例,这将产生一个新的作业实例。但是作业名称仍然相同。以下是它的工作原理:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/launing/support/runidincrementer.java#l44

 类似资料:
  • 我之前已经实现过几次Spring批处理,但它设计为一天只运行一次。 现在,我有了一个新的要求,每当记录插入表中时,我都需要开始批处理。当插入新记录时,它将启动作业,批处理将生成PDF并将其保存在存储库中,并向用户发送邮件。 我不知道如何设计一天运行多次的spring批处理,或者在这种情况下使用spring批处理是否正确。有人能解释一下吗。谢谢

  • 我是Docker的新手,我想知道是否可以使用不同的参数多次运行一个应用程序。 我使用.NET开发了我的应用程序,到目前为止,我已经使用Ubuntu服务执行了所有实例,比如: 其中是启动服务时传递的参数,如:

  • 问题内容: 从文件而不是从IDLE执行时,将运行多处理Process类的基本示例。为什么会这样,可以做到吗? 问题答案: 是。该功能的以下工作在单独的(第三)过程中运行。 但是,要查看输出,至少在Windows上,必须从这样的控制台启动IDLE。 (在2.x上使用。)原因是IDLE在单独的进程中运行用户代码。当前,IDLE进程和用户代码进程之间的连接是通过套接字进行的。通过多处理完成的派生不会复制

  • 我正在尝试为基于代理的模型(Repast)启动GUI,以便能够多次运行该模型。我将基于GUI中不同运行的不同分布生成输入参数。通常我们应该在不同的运行中使用批处理文件。然而,出于这个原因,我想使用GUI,因为我的GUI可以处理一次运行,但不能处理多次运行。你能帮我说说你在这方面的想法吗?

  • 问题内容: 我想使用React在整个DOM中多次添加组件。这个小提琴显示了我要执行的操作,并且不会引发任何错误。这是代码: HTML: JS: 我已经看过这个问题了,恐怕通过上述操作,我将冒使React组件相互干扰的风险。该问题的答案建议使用服务器端渲染,这对我来说不是一个选择,因为我正在使用Django服务器端。 另一方面,也许我在做什么就可以了,因为我只安装了一个React库实例(而不是多个组

  • 问题内容: 想象一下,您在Java中有一个典型的生产者- 消费者模式。为了提高效率,您要使用而不是在将新元素添加到队列时使用。如果两个生产者线程调用notify,是否保证将唤醒两个不同的正在等待的使用者线程?还是彼此之间很快触发的两个s导致同一用户线程排队两次唤醒?我找不到该部分描述此工作原理的API。Java是否有一些原子内部操作可仅一次唤醒线程? 如果仅一个消费者正在等待,则第二个通知将丢失,