Posts

Showing posts from January, 2019

Spring Batch JSR-305 支持

本发布版本中为 JSR-305 支持添加了一个注解。这个为了与 Spring 框架中的   Null-safety  注解取得平衡,然后为 Spring Batch 添加为 public APIs。 这个注解不仅仅在使用 Spring Batch APIs 来强制空安全(null-safety),同时还可以通过使用 IDEs 来提供有用的相关 nullability 信息。例如,如果用户希望实现  ItemReader   接口,任何能够支持 JSR-305 注解的 IDE 将会生成类似下面的代码: public class MyItemReader implements ItemReader<String> {         @Nullable         public String read() throws Exception {                 return null;         } } @Nullable  注解将会出现在  read  方法中,用来表示这个方法的内容可能将会返回一个  null。 这个将会强制在 Javadoc 中强制表示当在数据资源耗尽的时候,方法  read  将会返回一个  null 。

Spring Batch Bean 校验 API 支持

这个发布版本带来了一个新的  ValidatingItemProcessor 实现,这个实现被称为  BeanValidatingItemProcessor 。能够让你使用  Bean Validation API (JSR-303)  来校验 Item 的注解。例如给定下面的类型  Person: class Person {     @NotEmpty     private String name;     public Person(String name) {         this.name = name;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     } } 你可以通过在你的应用上下文中声明一个  BeanValidatingItemProcessor   并在你的原始块步骤中注册来校验 items: @Bean public BeanValidatingItemProcessor<Person> beanValidatingItemProcessor() throws Exception {       ...

IntelliJ IDEA 第一个 Scala 程序

Image
IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。 输入工程信息 在创建工程上面,输入工程的信息,指定工程的路径等。 在这里特别需要注意的地方是创建工程的 Scala SDK 配置,你需要现在你的系统中配置 SDK,有关配置 SDK 的方法,请参考页面 Scala 安装及环境配置 中的内容。 选择 SDK 单击创建后,你将会看到需要选择的 SDK。 在这里选择需要的 SDK 就可以了。 完成 SDK 选择后的新项目界面 当你完成 SDK 项目选择后的界面如下图,你可以看到你的 SDK 已经配置完成了。 然后单击这个界面中的  Finish(完成) 你就可以完成项目的创建了。 创建你的第一个 Scala 程序 在新创建的项目中,使用鼠标定位到 src 文件夹,然后右击,新建一个 Scala 的类。 输入新建类的名字 在弹出的窗口中,输入需要新建类的名字。 在这里,我们假设需要创建的类的名字为 Hello,你可以在这里输入你新创建的类的名字 Hello。 输入代码 你可以在代码输入窗口中,简单的输入下面的代码: object Hello  extends   App {    println( "Hello, World!" ) } 上面的代码将会简单的输入字符串 Hello, World! 运行代码 你有下面 2 个方法运行代码,你可以在左侧的项目中,选择需要运行的类。然后右击鼠标,在弹出窗口中选择运行 Hello,Hello 是你创建的这个类的名字。 你也可以直接在你的程序上面单击运行你创建的这个类。 程序运行的结果可以在下面的控制台中看到。 这样你就完成了你的第一个 Scala 类的创建和运行。 "C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edi...

IntelliJ IDEA 安装 Scala 插件

Image
本页面中对在 IntelliJ 中安装 Scala 插件的步骤和方法进行了描述。 需要在 IntelliJ  安装 Scala 插件,你首先需要在你的计算机中安装 IntelliJ 。IntelliJ  的安装比较简单,一般按照步骤安装就可以了。IntelliJ  有 2 个版本,一个是社区版,一个是专业版。社区版是免费的,如果你不想付费的话,安装 IntelliJ  社区版就可以了。 在 IntelliJ 找到设置中的插件 单击设置后打开设置窗口 在打开的设置窗口中,找插件选择项。 在插件选择项目的右侧,你应该可以看到 Scala 的插件安装选项,如果没有的话,你可以在搜索栏中进行搜索。 然后单击进行插件的安装。 Scala 插件安装进程 插件的安装进程请参考下面的图。 提示重启 安装完成后,按照提示要求重启 IntelliJ。 验证安装成功 想要验证安装是否成功,你可以尝试使用 IntelliJ 创建一个新的工程。 在创建工程的窗口中,如果你能看见 Scala 的选项的话,就说明你的插件已经安装成功了。 https://www.cwiki.us/pages/viewpage.action?pageId=41686035

Windows 上安装 Scala

Image
在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 Scala 官网地址  https://www.scala-lang.org/download/  下载 Scala 二进制包,本教程我们将下载  2.12.8  版本,如下图所示: 你可以下载 msi 文件,然后双击进行安装。然后按照安装的提示,一步步进行安装就可以了。 在安装的过程中你可以使用默认的安装目录。安装好 Scala 后,系统会自动提示,单击 Finish,完成安装。 你可以可以在官方网站中下载 zip 文件夹,在我们这个安装教程中,我们使用的是 zip 文件的方式进行安装的。假设我们你将解压后的文件放置在:C:\Users\Yucheng\Dkits\ 目录下,scala 是解压后的文件夹。你可以将这个文件夹防止到你系统中的任何位置。 右击我的电脑,单击"属性",进入如图所示页面。 下面开始配置环境变量,右击【我的电脑】->【属性】→【高级系统设置】→【环境变量】,如图: 设置 SCALA_HOME 的变量。 单击新建,在变量名栏输入: SCALA_HOME , 变量值一栏输入:C:\Users\Yucheng\Dkits\scala   也就是 scala 的安装目录,根据个人情况有所不同。可能安装的路径也有所不同。 新建一个安装变量: 输入变量的值: 设置 Path 变量: 找到系统变量下的"Path"如图,单击编辑。在"变量值"一栏的最前面添加如下的路径: %SCALA_HOME%\bin 你可以为用户设置 Path 变量,你也可以为系统设置 Path 变量。 将变量添加到启动 Path 中,这样命令行在启动的时候就可以定位到需要的 bin 文件中。 "变量值"最前面的; 不要漏掉。最后单击确定即可。 检查环境变量是否设置好了:调出"powershell"检查,你也可以使用 "cmd" 进行检查。 单击 【开始】,在输入框中输入 powershell,然后"回车...

Spring Batch JSON 支持

Spring Batch 4.1 开始能够支持 JSON 格式了。这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [   {     "isin": "123",     "quantity": 1,     "price": 1.2,     "customer": "foo"   },   {     "isin": "456",     "quantity": 2,     "price": 1.4,     "customer": "bar"   } ] 与针对 XML 的  StaxEventItemReader  类似,新的  JsonItemReader  使用流 API(streaming APIs)来读取 JSON 对象到块中。Spring Batch 能够支持下面 2 个库: Jackson Gson 如果你还希望添加其他的库的话,你可以实现  JsonObjectReader   接口。 JSON 数据的写是通过  JsonFileItemWriter  来支持的。 有关更多 JSON 数据的支持,请参考  ItemReaders and ItemWriters  章节中的内容。 https://www.cwiki.us/display/SpringBatchZH/JSON+support

Spring Batch @EnableBatchIntegration 注解

设置一个远程分块任务需要定义一系列的 beans: 一个连接工程来从消息中间件中获得连接,消息中间件包括有(JMS,AMQP 和其他) 一个  MessagingTemplate   来从主向从发送消息,然后再次发送回来 为 Spring 整合从消息中间件中获得消息来创建一个输入和输出通道 一个特殊的内容写(item writer)(ChunkMessageChannelItemWriter)在主机侧,这样真多处理和写入能够知道如何发送分块数据到工作机 在工作机侧的消息监听器(ChunkProcessorChunkHandler)来从主机上接受数据 这个在第一次看来的时候好像非常复杂,并且是一个艰巨的任务。在新发布的版本中我们介绍使用注解  @EnableBatchIntegration  来作为一个新的 API( RemoteChunkingMasterStepBuilder  和  RemoteChunkingWorkerBuilder ) 来简化配置。下面的示例显示了如何使用新的注解和 API: @Configuration @EnableBatchProcessing @EnableBatchIntegration public class RemoteChunkingAppConfig {    @Autowired    private RemoteChunkingMasterStepBuilderFactory masterStepBuilderFactory;    @Autowired    private RemoteChunkingWorkerBuilder workerBuilder;    @Bean    public TaskletStep masterStep() {          return this.master...

Spring Batch @SpringBatchTest 注解

Spring Batch 提供了一些非常有用的工具类(例如  JobLauncherTestUtils  和  JobRepositoryTestUtils )和测试执行监听器( StepScopeTestExecutionListener  和  JobScopeTestExecutionListener )来测试批量组件。然而, 为了能够使用这些工具类,你必须明确的对它们进行配置。这个发布介绍了一个新的注解,这个注解被命名为  @SpringBatchTest  能够自动的添加工具 bean(utility beans)和监听器(listeners)来测试上下文并且为自动写入来标记为可用,下面是一个示例代码: @RunWith (SpringRunner. class ) @SpringBatchTest @ContextConfiguration (classes = {JobConfiguration. class }) public   class   JobTest {       @Autowired     private   JobLauncherTestUtils jobLauncherTestUtils;       @Autowired     private   JobRepositoryTestUtils jobRepositoryTestUtils;         @Before     public   void   clearMetadata() {        jobRepositoryTestUtils.removeJobExecutions();     }       @...

Spring Batch 批量处理策略

Image
为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序。 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分一系列的步骤,而这些步骤又是可以通过下面的标准构件块来实现的: 转换应用程序(Conversion Applications) :针对每一个从外部系统导出或者提供的各种类型的文件,我们都需要创建一个转换应用程序来讲这些类型的文件和数据转换为处理所需要的标准格式。这个类型的批量应用程序可以是正规转换工具模块中的一部分,也可以是整个的转换工具模块(请查看:基本的批量服务(Basic Batch Services))。 校验应用程序(Validation Applications) :校验应用程序能够保证所有的输入和输出记录都是正确和一致的。校验通常是基于头和尾进行校验的,校验码和校验算法通常是针对记录的交叉验证。 提取应用(Extract Applications) :  这个应用程序通常被用来从数据库或者文本文件中读取一系列的记录,并对记录的选择通常是基于预先确定的规则,然后将这些记录输出到输出文件中。 提取/更新应用(Extract/Update Applications) :这个应用程序通常被用来从数据库或者文本文件中读取记录,并将每一条读取的输入记录更新到数据库或者输出数据库中。 处理和更新应用(Processing and Updating Applications) :这种程序对从提取或验证程序 传过来的输入事务记录进行处理。这处理通常包括有读取数据库并且获得需要处理的数据,为输出处理更新数据库或创建记录。 输出和格式化应用(Output/Format Applications) :一个应用通过读取一个输入文件,对输入文件的结构重新格式化为需要的标准格式,然后创建一个打印的输出文件,或将数据传输到其他的程序或者系统中。 更多的,一个基本的应用外壳应该也能够被针对商业逻辑来提供,这个外壳通常不能通过上面介绍的这些标准模块来完成。 另外的一个主要的构建块,每一个引用通常可以使用下面的一个或者多个标准工具步骤,例如: 分类(Sort)- 一个程序可以读取输入文件后生成一个输出文件,在这个输出文件中可以对记录进行重新排序,重新...

Spring Batch 基本的批处理指导原则

下面是一些关键的指导原则,可以在构批量处理解决方案可以参考: 请记住,通常皮脸处理体系结构将会影响在线应用的体系结构,同时反过来也是一样的。在你为批量任务和在线应用进行设计架构和环境的时候请尽可能的使用公共的模块。 越简单越好,尽量在一个单独的批量应用中构建简单的批量处理,并避免复杂的逻辑结构。 尽量的保持存储的数据和进程存储在同一个地方(换句话说就是尽量将数据保存到你程序运行的地方)。 最小化系统资源的使用,尤其针对 I/O。尽量在内存中执行尽可能多的操作。 检查应用的 I/O(分析 SQL 语句)来避免不必要的的物理 I/O 使用。特别是以下四个常见的缺陷(flaws)需要避免: 在数据可以只读一次就可以缓存起来的情况下,针对每一个事务都来读取数据 多次读取/查询同一事务中已经读取过的数据 产生不必要的表格或者索引扫描 在 SQL 查询中不指定 WHERE 查询的值。 在批量运行的时候不要将一件事重复 2 次。例如,如果你需要针对你需要报表的数据汇总,请在处理每一条记录时使用增量来存储,尽可能不要再去遍历一次同样的数据。 为批量进程在开始的时候就分配足够的内存,以避免在运行的时候再次分配内存。 总是将数据完整性假定为最坏情况。对数据进行适当的检查和数据校验以保持数据完整性(integrity)。 可能的话,请实现内部校验(checksums )。例如,针对文本文件,应该有一条结尾记录,这个记录将会说明文件中的总记录数和关键字段的集合(aggregate)。 尽可能早地在模拟生产环境下使用真实的数据量,以便于进行计划和执行压力测试。 在大数据量的批量中,数据备份可能会非常复杂和充满挑战,尤其是你的系统要求不间断(24 - 7)运行的系统。数据库备份通常在设计时就考虑好了,但是文件备份也应该提升到同样的重要程度。如果系统依赖于文本文件,文件备份程序不仅要正确设置和形成文档,还要定期进行测试。 https://www.cwiki.us/display/SpringBatchZH/General+Batch+Principles+and+Guidelines

Spring Batch 体系结构

Image
Spring Batch 设计的时候充分考虑了可扩展性和各类终端用户。 下图显示了 Spring Batch 的架构层次示意图,这种架构层次为终端用户开发者提供了很好的扩展性与易用性. 上图显示的是 Spring Batch 层级体系结构 这个层级体系结构高亮显示了 Spring Batch 的 3 个主要组件:应用(Application),核心(Core)和 基础架构(Infrastructure)。 应用层包含了所有的批量作业和开发者使用 Spring Batch 写的所有自定义代码。批量核心层包含了所有运行和控制批量作业所需必要的运行时类。同时还包括了有 JobLauncher ,  Job , 和 Step 的实现。应用层和核心层都构建在基础架构层之上。 基础架构层包含了有 读(readers)和 写(writers )以及服务(services)。例如有针对服务使用,  RetryTemplate 。基础架构层的这些东西,这些能够被应用层开发(readers 和 writers,例如   ItemReader 和 ItemWriter )和批量核心框架(例如,retry,这个是核心层自己的库)所使用。 简单的来说,基础架构层为应用层和批量核心层提供了所需要的的基础内容,是整个  Spring Batch 的基础。我们针对 Spring Batch 的开发绝大部分情况是在应用层完成的。 https://www.cwiki.us/display/SpringBatchZH/Spring+Batch+Architecture

Spring Batch 使用场景

一个标准的批处理程序通常会从数据库,文件或者队列中读取大量的数据和记录,然后对获取的数据进行处理,然后将修改后的格式写回到数据库中。 通常 Spring Batch 在离线模式下进行工作,不需要用户干预就能自动进行基本的批处理迭代,进行类似事务方式的处理。批处理是大多数 IT 目的一个组成部分,而 Spring Batch 是唯一能够提供健壮的企业级扩展性的批处理开源框架。 业务场景 周期提交批处理任务 同时批处理进程:并非处理一个任务 分阶段的企业消息驱动处理 高并发批处理 失败后的手动或定时重启 按顺序处理任务依赖(使用工作流驱动的批处理插件) 部分处理:跳过记录(例如,回滚) 全批次事务:因为可能有小数据量的批处理或存在存储过程/脚本中 技术目标 批量的开发者使用 Spring 的编程模式:开发者能够更加专注于业务逻辑,让框架来解决基础的功能 在基础架构、批处理执行环境、批处理应用之间有明确的划分 以接口形式提供通用的核心服务,以便所有项目都能使用 提供简单的默认实现,以实现核心执行接口的“开箱即用” 通过在所有层中对 Spring 框架进行平衡配置,能够实现更加容易的配置,自定义和扩展服务。 所有存在的核心服务应该能够很容易的在不对系统架构层进行影响的情况进行替换或扩展。 提供一个简单的部署模块,使用 Maven 来进行编译的 JARs 架构,并与应用完全分离。 https://www.cwiki.us/display/SpringBatchZH/Usage+Scenarios

Spring Batch 背景

在开源项目及其相关社区把大部分注意力集中在基于 web 和 SOA 基于消息机制的框架中时,基于 Java 的批处理框架却无人问津,尽管在企业 T 环境中一直都有这种批处理的需求。但因为缺乏一个标准的、可重用的批处理框架导致在企业客户的IT系统中存在着很多一次编写,一次使用的版本,以及很多不同的内部解决方案。 SpringSource 和 Accenture(埃森哲)致力于通过合作来改善这种状况。埃森哲在实现批处理架构上有着丰富的产业实践经验,SpringSource 有深入的技术开发积累,背靠Spring框架提供的编程模型,意味着两者能够结合成为默契且强大的合作伙伴,创造出高质量的、市场认可的企业级 Java 解决方案,填补这一重要的行业空白。两家公司目前也正着力于开发基于 Spring 的批处理解决方案,为许多客户解决类似的问题。这同时提供了一些有用的额外的细节和以及真实环境的约束,有助于确保解决方案能够被客户用于解决实际的问题。基于这些原因,SpringSource  和 Accenture 一起合作开发了 Spring Batch。 埃森哲已经贡献了先前自己的批处理体系结构框架,这个框架基于数十年宝贵的经验并基于最新的软件平台(如COBOL/Mainframe, C++/Unix 及现在非常流行的Java平台)来构建 Spring Batch 项目,Spring Batch 未来将会由开源社区提交者来驱动项目的开发,增强,以及未来的路线图。 埃森哲咨询公司与 SpringSource 合作的目标是促进软件处理方法、框架和工具的标准化改进,并在创建批处理应用时能够持续影响企业用户。企业和政府机构希望为他们提供标准的、经验证过的解决方案,而他们的企业系统也将受益于 Spring Batch。 https://www.cwiki.us/display/SpringBatchZH/Background

Spring Batch 介绍

在企业应用的关键环境中,通常有需要很多应用来来处理大量的应用。这商业操作包括了自动化,并且负责的处理程序来对大量数据进行高效的处理,通常这些程序不需要人工进行干预。这些事件包括有基于时间周期产生的操作(例如,月末统计计算,通知或者消息通知,或者定期处理那些业务逻辑非常复杂,并且数据量非常大的操作(例如,保险的保额确定或者保险费率的调整),也有可能是从内部或者外部抓取到的数据的格式化,通常这些数据需要进行格式化,校验,并且通过事务来整合到自己的数据库中。批处理通常被用来针对企业每天产生超过亿万级别的数据量。 Spring Batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务。Spring Batch 是基于生产率来进行构建的,并且基于 POJO 进行开发,用户也很容易上手使用,让开发者很容易的访问和使用企业级服务。Spring Batch 不是一个自动运行框架。在市面已经有了很多企业级和开源的自动运行框架,例如 Quartz,Tivoli, Control-M 等。Spring Batch 被设计与计划任务和调度程序一同协作完成任务,而没有被设计用来取代任务调度和计划任务。 Spring Batch 提供了可重用的功能,这些功能被用来对大量数据和记录进行处理,包括有日志/跟踪(logging/tracing),事务管理(transaction management),任务处理状态(job processing statistics),任务重启(job restart),任务跳过(job skip)和资源管理(resource management)。 此外还提供了许多高级服务和特性, 使之能够通过优化(optimization ) 和分片技术(partitioning techniques)来高效地执行超大型数据集的批处理任务。 Spring Batch 是一个具有高可扩展性的框架。不管简单还是复杂,还是大批量的处理任务,都可以使用 Spring Batch 框架来实现。 https://www.cwiki.us/display/SpringBatchZH/Spring+Batch+Introduction