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

为什么任务在Spring云数据流中上线后不销毁?

郭阳曜
2023-03-14

我已经创建了一些Spring批处理项目,并使用Spring Cloud Data Flow(SCDF)部署了这些作业。
在SCDF中启动任务(作业)后,创建JVM执行任务(作业)。
但是,当任务完成时,JVM并不结束。它仍然存在。
当我启动作业20次时,它宣布

Cannot launch task A. The maximum concurrent task executions is at its limit [20]

并且有一些关于我的作业的信息,作业的第一个日志是以:

HikariPool-1 - Shutting down...

但是在我为Spring批处理项目使用了以下属性之后:

spring.cloud.task.singleInstanceEnabled=true

并使用JobExecutionListenerSupport使用afterJob方法,任务(作业)的日志以:

o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=remindJob]] completed with the following parameters: [{run.id=3}] and the following status: [COMPLETED] in 7s636ms
o.s.integration.leader.DefaultCandidate  : DefaultCandidate{role=EngineProcess, id=126} leadership has been revoked: LockContext{role=Process, id=126, isLeader=false}

这些是我的Spring批处理作业的问题吗?

而我的主要问题是,哪一个负责完全停止JVM(任务)?Spring云数据流部分还是Spring批处理部分以及如何处理?

我认为当任务完成时,应该将其销毁(JVM停止),同时执行任务的数量不能达到极限。

共有1个答案

满昊然
2023-03-14

我从github获得了设置属性spring.cloud.task.Closecontext_enabled=true的解决方案。但是,我想深入理解为什么没有spring.cloud.task.Closecontext_enabled就不能完全关闭上下文的原因。将该属性设置为true之后。我的Spring批处理项目的日志显示警告:

main] o.s.b.f.support.DisposableBeanAdapter : Destroy method 'close' on bean with name 'getStudent' threw an exception: org.springframework.batch.item.ItemStreamException: Error while closing item reader

还有ItemReader代码:

@Bean
public JdbcCursorItemReader<Student> getStudent() {
    JdbcCursorItemReader <Student> reader = new JdbcCursorItemReader<>();
    reader.setDataSource(dataSource);
    reader.setSql(QueryConstants.getStudent);   
    reader.setRowMapper(new BeanPropertyRowMapper<>(Student.class)); 
    return reader;  
}
 类似资料:
  • 我试图了解运行批处理任务时通过Spring Cloud数据流WRT数据源配置的预期行为。 Spring批处理数据库表(Batch\u JOB\u EXECUTION等)是否在SCDF数据库本身中?当通过SCDF启动任务时,似乎发生了一些神奇的事情,它在SCDF数据库中创建了这些表,并似乎在使用它们。它似乎正在将SCDF数据源注入我的应用程序? 我目前在localhost服务器版本2.0.1上运行。

  • 我在Openshift集群上安装了一个Spring Cloud数据流。我尝试注册一个应用程序,然后创建一个任务,一切都很好,但当我试图安排任务时,我遇到了以下异常: 我不知道这是什么意思,我是Dataflow的新手。我不明白为什么他试图使用Maven而不是kubernetes部署器,也不明白为什么我会出现这个错误。有人能再给我解释一下吗? 顺便说一句,我将这些应用程序注册为docker容器。

  • 目前,我正在从Spring XD作为我的工作流和运行时环境转移到Spring Cloud DataFlow和Apache Airflow。我想在Airflow中创建工作流,并使用自定义的Airflow操作员通过REST-API在Spring Cloud DataFlow服务器上运行Spring Cloud任务。 可以使用: 不幸的是,DataFlow在此请求中不返回作业执行ID,以创建用于监视应用

  • 我有一个从流-任务-启动器-数据流调用的组合任务 我将流处理器中的几个属性传递给任务启动器数据流和子任务,例如。。。 这可以正常工作,但我已经达到了最大字符限制,并在组合任务pod上得到一个sql异常,说明我已经超过了2500个字符的限制。我想为所有任务而不是单独设置属性以节省字符空间,但使用通配符不起作用 有没有办法为所有任务设置属性,而不必单独设置? 我尝试在kubernetes中的Sprin

  • 启动没有参数的时间戳任务应用程序失败。来自Spring Cloud Data Flow Server的日志显示了以下堆栈跟踪:https://gist.github.com/anonymous/420f3928b7831a11b378fc6792be1ffc。 运行输出 则生成

  • 根据我所看到的,在Spring Cloud Dataflow(SCDF)中创建流将部署底层应用程序,绑定通信服务(如RabbitMQ),设置Spring Cloud stream环境变量,并启动应用程序。这一切都可以使用cf push命令轻松手动完成。 同时,我在Spring Cloud Dataflow中遇到了一些缺点: SCDF服务器是PCF上的内存占用者(我有一个只有6个应用程序的流,但我需