当前位置: 首页 > 科技观察

配置SpringBatch批处理失败重试

时间:2023-03-21 11:17:32 科技观察

1。简介默认情况下,如果在执行过程中出现任何错误,SpringBatch作业将失败。然而,有时候,为了提高应用程序的弹性,我们需要处理这种间歇性故障。在这篇简短的文章中,我们将讨论如何在Spring批处理框架中配置重试逻辑。对springbatch不了解的可以参考之前的一篇文章:驾驭!SpringBatch入门级示例教程!2.简单例子假设有一个批处理作业读取一个CSV文件作为输入:username,userid,transaction_date,transaction_amountsammy,1234,31/10/2015,10000john,9999,3/12/2015,12321然后处理每条记录通过访问REST端点,获取用户的年龄和邮政编码属性:.getUserId());//parseuser'sageandpostCodefromresponseandupdatetransaction}act...}它生成并输出合并的XML:10000.02015-10-3100:00:001234sammy10430222...</transactionRecord>3.在ItemProcessor中添加重试现在假设,如果到REST端点的连接由于某些慢速网络而超时怎么办?如果发生这种情况,我们的批处理作业将在此失败。在某些情况下,我们希望重试几次失败的项目处理。所以接下来我将批处理作业配置为:失败时最多执行三次重试:@BeanpublicStepretryStep(ItemProcessorprocessor,ItemWriterwriter)throwsParseException{returnsstepBuilderFactory.get("retryStep")。<事务,事务>chunk(10).reader(itemReader(inputCsv)).processor(processor).writer(writer).faultTolerant().retryLimit(3).retry(ConnectTimeoutException.class).retry(DeadlockLoserDataAccessException.class).build();}此处调用faultTolerant()以启用重试。此外,我们使用retry和retryLimit分别定义异常和满足重试条件的项目的最大重试次数。4.测试重试假设我们有一个测试场景,其中REST端点返回age和postCode在一段时间内关闭。在这个测试场景中,我们只为前两个API调用获得ConnectTimeoutException,而第三个调用将成功:newStringEntity("{\"age\":10,\"postCode\":\"430222\"}"));//firsttwocallsandpassesthirdtimeonwardswhen(httpClient.execute(any())).thenThrow(newConnectTimeoutException("Timeoutcount1")).thenThrow(newConnectTimeoutException("Timeoutcount2")).thenReturn(httpResponse);JobExecutionjobExecution=jobLauncherTestUtils.launchJob(defaultJobParameters());JobInstanceactualJobInstance=jobExecution.getJobInstance();ExitStatusactualJobExitStatus=jobExecution.getExitStatus()actualJassertThat(。getJobName(),is("retryBatchJob"));assertThat(actualJobExitStatus.getExitCode(),is("COMPLETED"));AssertFile.assertFileEquals(expectedResult,actualResult);}到这里,我们的工作就顺利完成了另外从日志中可以明显看出,第一条记录id=1234失败了两次,第三次重试终于成功了:19:06:57.742[main]INFOo.s.batch.core.job。SimpleStepHandler-执行步骤:[retryStep]19:06:57.758[main]INFOo.b.batch.service.RetryItemProcessor-Attemptingtoprocessuserwithid=123419:06:57.758[main]INFOo.b.batch.service.RetryItemProcessor-Attemptingtoprocessuserwithid19:026:57.758[main]INFOo.b.batch.service.RetryItemProcessor-Attemptingtoprocessuserwithid=123419:06:57.758[main]INFOo.b.batch.service.RetryItemProcessor-Attemptingtoprocessuserwithid=999919:06:57.773[main]INFOo.s.batch.core..."Endpointisdown"));JobExecutionjobExecution=jobLauncherTestUtils.launchJob(defaultJobParameters());JobInstanceactualJobInstance=jobExecution.getJobInstance();ExitStatusactualJobExitStatus=jobExecution.getExitStatus();assertThat(actualJobInstance.getJobName(),is("retryBatchJob"));assertThat(actualJobExitStatus.getExitCode(),is("FAILED"));assertThat(actualJobExitStatus.getExitDescription(),containsString("org.apache.http.conn.ConnectTimeoutException"));}在此测试用例中,在作业因ConnectTimeoutException而失败之前,在第一条记录上尝试了三次重试5.使用XML配置重试最后,让我们看一下与上述配置等效的XML:writer="itemWriter"processor="retryItemProcessor"commit-interval="10"retry-limit="3">6。小结在本文中,我们学习了如何在Spring批处理中配置重试逻辑,包括使用Java和XML配置。并使用单元测试来了解重试在实践中是如何工作的。本文转载自微信公众号《锅外大哥》,可通过以下二维码关注。转载本文请联系锅外老板公众号。