Spring Batch可重启性

首先,我要非常感谢Spring的优秀人员,他们花了无数时间来确保Spring Batch作业的可行性,以及发出重新启动作业的神奇能力! 感谢您提供的这个优雅的工具集,它使我们能够浏览大量数据集,同时使我们在跌倒时能够摆脱尘埃!

在承认我还有很多东西要学习的同时,我想分享一下有关可重新启动性方面的经验教训。 这篇文章将包括如何识别Spring Batch的Step&Job ExecutionContext的不正确使用,以及如何为Spring Batch编写良好,有益的组件。

有状态!

对于具有可变全局变量的bean,有状态性基本上是幻想。

例如,拿一张一美元的钞票。 它的值是恒定的,因此将被视为无状态。 另一方面,以Google等股票为例; 价格波动,其价值将被视为可变(或有状态)。

执行上下文

为了保持状态,Spring使我们能够同时访问Step&Job的ExecutionContext ,以便我们可以处理需要保持正常工作并正确完成的信息。

批处理代码库中有状态的任何内容都会威胁到其可重新启动性的可行性。 有状态的处理器,读取器,写入器或批处理操作使用的任何东西都应视为处于危险之中。

从技术上讲,我想任何可序列化的对象都可以随时放入ExecutionContext中,但是我认为这是一种危险的思考方式。 ExecutionContext更新应以非常事务性的方式进行处理。

什么信息

我建议仅在此处保留原始/伪原始简单值。 如果您想在晚上轻松入睡,我还建议仅通过ItemProcessor或使用@BeforeStep或@AfterStep注释的方法来编写这些值。

什么不应该发生?

不应在核心业务逻辑中引入和传递ExecutionContext。 上下文值不应在步骤执行过程中进行更新。 另外,您应该避免将可变的值持有者对象引入ExecutionContext,因为其引用很容易破坏事务边界后面的值。

当我在代码中看到这些类型的示例时,我认为它们对应用程序的可重新启动性构成威胁,并拒绝证明该应用程序的可重新启动性。

通常,没有一种千篇一律的方法来确保您的工作代码以确保正确处理有状态信息的方式编写。 但是,我将告诉您,您需要考虑以下问题:

  • 事务如何完成(分布式,分区,多线程等)
  • 如何跟踪块进度?
  • 您的读物如何排序/分组?
  • 重新启动时需要什么信息?

这是更新作业相关状态信息的一般示例:

import org.springframework.batch.item.*;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/*This could be a reader, or a writer, or maybe a processor... 
  you need to identify when and where it is appropriate to 
  perform these tracking activities. Remember to think about restarts! */
@Component
@StepScope
public class FooComponent implements ItemStream{ 

// a perfectly acceptable way to read a value from an ExecutionContext from anywhere!
@Value(“#stepExecutionContext[‘fooStatefulCount’]”) 
long statefulCount = 0; // a read count perhaps?

public static final String KEY = "bar";
public void open(ExecutionContext cxt) throws ItemStreamException {
	cxt.put(KEY, statefulCount);
}
public void update(ExecutionContext cxt) throws ItemStreamException {
	cxt.put(KEY, statefulCount);
}	
public void close() throws ItemStreamException {}
}

如果您想要更全面的示例,请浏览AbstractItemCountingItemStreamItemReader中的open方法!

最后的想法

对于其他开发人员,我的最终建议是在编写代码时力求从根本上变得完全普通。 简单性将使您对未来有所了解,随后,企业主将珍惜您的礼物,该应用程序基本上没有技术债务。

翻译自: https://www.javacodegeeks.com/2017/04/spring-batch-restartability.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值