Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继续spring批处理作业的正确方法_Java_Spring_Spring Batch - Fatal编程技术网

Java 继续spring批处理作业的正确方法

Java 继续spring批处理作业的正确方法,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个带有步骤集的spring批处理作业 如果某个步骤因异常而失败或停止,我有两种可能的方法重新启动它: 1) JobOperator.restartJob(long executionId)-按执行id重新启动 2) 从数据库读取失败的JobExecution并调用Job.execute(JobExecution) 第一种方法将创建JobExecution的副本,并使用方法Job.execute(JobExecution)运行它。这条路不行 如果已完成的步骤具有可重启属性“false”,则重

我有一个带有步骤集的spring批处理作业

如果某个步骤因异常而失败或停止,我有两种可能的方法重新启动它:

1) JobOperator.restartJob(long executionId)-按执行id重新启动

2) 从数据库读取失败的JobExecution并调用Job.execute(JobExecution)

第一种方法将创建JobExecution的副本,并使用方法Job.execute(JobExecution)运行它。这条路不行 如果已完成的步骤具有可重启属性“false”,则重新运行这些步骤。这对我来说是一种可取的行为,但这种方式有问题 我有一个大的执行上下文副本,反序列化的速度不是很快

第二种方法只是重新运行现有的JobExecution实例。此外,它将重新运行所有已完成的步骤,即使这些步骤可重新启动 属性“假”。这让我很困惑,因为我只想继续执行未完成步骤的任务


你能解释一下我应该用什么方法吗?

为什么你有一个大的
ExecutionContext
?在
ExecutionContext
中,我存储了作业所需的所有数据。在本例中,超过1100万个long,它允许我在不重新读取DB ID的情况下恢复作业。您不应该这样做。
ExecutionContext
不是缓存。这就是你在第一个问题上的原因。我有以下步骤:1。将ID的“列表”读取到“ExecutionContext”2中的步骤。从“ExecutionContext”(读取器)获取ID的“列表”并按顺序读取的步骤。3.处理ID,然后在第二步或第三步失败时写入处理数据的步骤
ExecutionContext
将存储在数据库中。从
ExecutionContext
重新启动作业时,将还原未处理的ID。该体系结构存在缺陷。你真的应该使用一个驱动查询。您可以在以下文档中阅读: