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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tf.clip_by_value()

tf.clip_by_value(A, min, max) 输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。 小于min的让它等于min,大于max的元素的值等于max。

python如何导入seaborn_Seaborn - 导入数据集和库

教 程 目 录 在本章中,我们将讨论如何导入数据集和库.让我们首先了解如何导入库. 导入库 让我们从导入Pandas开始,这是一个管理关系的好库(表格式)数据集. Seaborn在处理DataFrames时非常方便,DataFrames是用于数据分析的最广泛使用的数据结构…

Windows安装Redis(转!)

转自https://www.cnblogs.com/wxjnew/p/9160855.html “现在我已经走到了人生的十字路口边了,我相信,在已走过的人生道路中,我一直知道其中哪一条是正确的,是的,我一直坚信我知道。但是我却从未选择那些正确的道路&…

弃用Java的终结器

JDK-8165641 (“ Deprecate Object.finalize”)已打开以“ deprecate Object.finalize() ”,因为“ finalizer本质上存在问题,使用finalizer可能会导致性能问题,死锁,挂起和其他问题…

python安装mysqlclient_Python-安装mysqlclient(MySQLdb)

mysqlclient(也就是Python3版本的MySQLdb),性能比pymysql好,速度更快及PyMySQL的应用场景;所以一般大项目建议使用MySQLdb 使用pip安装 pip install mysqlclient 安装过程中可能会出现如下问题:解决方法如下…

tesorflow 填充‘same’与‘valid’

源码: #codingutf-8import tensorflow as tf# case 2 input tf.Variable(tf.random_normal([1, 256, 256, 3]))op1 tf.layers.conv2d(inputsinput, filters164, kernel_size(7, 7), strides(2, 2), padding"same", activationtf.nn.relu)op2 tf.layer…

hadoop中两种上传文件方式

记录如何将本地文件上传至HDFS中 前提是已经启动了hadoop成功(nodedate都成功启动) ①先切换到HDFS用户 ②创建一个user件夹 bin/hdfs dfs -mkdir /user (hadoop目录下) 多级创建的时候 hdfs dfs -mkdir -p /wifi/classify 查看创…

c语言科学计数法_C入门:C语言中数据的储存(上)

How Data is stored in computer memory?储存数据是计算机进行各种数据操作的基础,为了理解计算机可以对哪些数据进行怎样的操作,有必要了解数据在计算机中的储存方式。为了有效防止失真,提高数据的准确性和稳定性,计算机使用二进…

tf.layers.dense

tf.layers.dense( inputs, units, activationNone, use_biasTrue, kernel_initializerNone, bias_initializertf.zeros_initializer(), kernel_regularizerNone, bias_regularizerNone,activity_regularizerNone, trainableTrue, nameNone, reuseNone ) 各参数含义:…

java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法

java 修改 枚举类字段在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例。 显然,这仅适用于Sun的JDK。 如果需要在另一个JVM上执行此操作,则您…

tf.reduce_mean

tf.reduce_mean(input_tensor, axisNone, keep_dimsFalse, nameNone, reduction_indicesNone) 作用:沿着张量不同的数轴进行计算平均值。 参数:input_tensor: 被计算的张量,确保为数字类型。 axis: 方向数轴,如果没有…

display函数怎么使用_使用网络构建复杂布局超实用的技巧,赶紧收藏吧

前端开发工程师必读书籍有哪些值得推荐?我们直接进入代码,如下所示,先写些标签,源码在这个链接里面:https://codepen.io/Shadid/pen/zYqNvgvHeader Aside 1 Section Aside 2 Footer在上面,我们创建了一…

安装后jdk1.8 配置环境变量以后 版本显示还是1.7

配置图如下 1.7版本不用卸载 不用就可以了 转载于:https://www.cnblogs.com/roujiamo/p/10836593.html

为@Cacheable设置TTL – Spring

今天,我被要求为应用程序正在使用的某些键设置缓存的过期时间,因此我Swift开始寻找Spring Cacheable表示法提供的所有选项,以设置过期时间或生存时间。 由于Spring没有提供任何可配置的选项来实现它,因此,我利用固定延…

tf.equal

tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的 import tensorflow as tf import numpy as np A [[1,3,4,5,6]] B [[1,3,4,3,2]] with tf.Session() a…

校验输入框的内容不能重复_答应我,用了这个jupyter插件,别再重复造轮子了

以下文章来源于Python大数据分析 ,作者费弗里1 简介在使用Python、R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题&#xff1…

P2387 [NOI2014]魔法森林

和最小差值生成树差不多 都是用lct维护生成树的题目 本题可以以a排序,再维护b(通常这种二维变量的题都差不多这样,先排序一维) 然后我tm竟然rotate手误打错了一点...调了好久.. 然后关于pushup:关于最大值,…

C# float/double 减 float/double 等 (X.xxxxxxxxxxxxxE-07)(黑盒测试)

问题 因为没有深究原理,所有只进行了“黑盒测试” 黑盒测试结论: 问题操作结论float/double运算进过一系列的运算后大概率 ! 0.0 , 而是等于0.00000000000xxxx等于X.xxxxxxxx一串数字的时候不影响下一步继续使用当需要显示fl…

ABP的新旧版本

新版本 https://abp.io/documents/abp/latest/Index https://github.com/abpframework/abp ABP is an open source application framework focused on ASP.NET Core based web application development, but also supports developing other types of applications. 旧版本…

tensorflow的优化器Optimizer

种类如下,其中Optimizer是基类tf.train.Optimizertf.train.GradientDescentOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizertf.train.AdagradDAOptimizertf.train.MomentumOptimizertf.train.AdamOptimizertf.train.FtrlOptimizertf.train.ProximalG…