我最近协助一个客户启动并运行了Spring Batch实现。 该团队决定继续为批处理作业使用基于JavaConfig的配置,而不是传统的基于XML的配置。 随着这越来越成为配置Java应用程序的一种常用方法,我觉得是时候更新Keyhole的Spring Batch系列了 ,向您展示如何将现有的基于XML的Spring Batch配置转换为新的基于JavaConfig批注的配置。

本教程将使用在我们的第二批Spring教程( https://keyholesoftware.com/2012/06/25/getting-started-with-spring-batch-part-two/ )中找到的简单批处理作业。

房子清洁

在开始转换过程之前,我们需要对项目进行一些房屋清洁。

  1. 尚未将Java构建和Spring环境升级到Java 7。
  2. 将Spring Boot依赖项添加到Maven pom.xml:
  3. <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId><version>1.2.4.RELEASE</version>
    </dependency>
  4. 将Spring Batch版本修改为3.0.4.RELEASE,并将Spring Framework版本修改为4.1.6.RELEASE
    <properties>                              <spring.framework.version>4.1.6.RELEASE</spring.framework.version><spring.batch.version>3.0.4.RELEASE</spring.batch.version>
    </properties>
  5. 在名为module-context.xml的原始批处理配置文件中注释掉作业定义。
  6. 在名为launch-context.xml的配置文件中注释掉Spring应用程序上下文配置元素。
  7. 注释掉Reader,Processor和Writer元素上的@Component批注。 不要注释掉CurrencyConversionServiceImpl类上的@Service批注。

构建基于JavaConfig的配置

现在,我们已经删除或禁用了现有的基于XML的配置,我们可以开始构建基于JavaConfig的配置。 为此,我们需要创建一个带有一些注释的新类,这些注释为配置奠定了基础。

package com.keyhole.example.config;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableBatchProcessing
public class TickerPriceConversionConfig {@Autowiredprivate JobBuilderFactory jobs;@Autowiredprivate StepBuilderFactory steps;}

@Configuration批注使Spring容器知道该类将包含一个或多个@Bean批注的方法,这些方法将在运行时进行处理以生成Bean定义和服务请求。

@EnableBatchProcessing批注提供了用于构建批处理作业配置的基本配置。 Spring Batch使用此注释来设置默认的JobRepository,JobLauncher,JobRegistry,PlatformTransactionManager,JobBuilderFactory和StepBuilderFactory。

现在是时候为组成批处理作业的组件添加@Bean注释的方法了。 作为参考,我为每个bean包括了相应的XML配置。

ItemReader配置

<bean name="tickerReader"class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource"
value="http://finance.yahoo.com/d/quotes.csv?s=XOM+IBM+JNJ+MSFT&f=snd1ol1p2" /><property name="lineMapper" ref="tickerLineMapper" />
</bean><bean name="tickerLineMapper"
class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="fieldSetMapper" ref="tickerMapper" /><property name="lineTokenizer" ref="tickerLineTokenizer" />
</bean><bean name="tickerLineTokenizer"
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" />
@Beanpublic ItemReader<TickerData> reader() throws MalformedURLException {FlatFileItemReader<TickerData> reader = new FlatFileItemReader<TickerData>();reader.setResource(new UrlResource("http://finance.yahoo.com/d/quotes.csv?s=XOM+IBM+JNJ+MSFT&f=snd1ol1p2"));reader.setLineMapper(new DefaultLineMapper<TickerData>() {{setLineTokenizer(new DelimitedLineTokenizer());setFieldSetMapper(new TickerFieldSetMapper());}});return reader;}

ItemProcessor和ItemWriter之前使用Spring容器的@Component批注来拾取bean并将其加载到应用程序上下文中。

@Beanpublic ItemProcessor<TickerData, TickerData> processor() {return new TickerPriceProcessor();}@Beanpublic ItemWriter<TickerData> writer() {return new LogItemWriter();}

现在我们已经定义了Spring bean,我们可以创建表示步骤和工作的@Bean注释方法。 作为参考,我包括了相应的XML配置。

<batch:job id="TickerPriceConversion"><batch:step id="convertPrice"><batch:tasklet transaction-manager="transactionManager"><batch:chunk reader="tickerReader"processor="tickerPriceProcessor"writer="tickerWriter" commit-interval="10" /></batch:tasklet></batch:step></batch:job>
@Beanpublic Job TickerPriceConversion() throws MalformedURLException {return jobs.get("TickerPriceConversion").start(convertPrice()).build();}@Beanpublic Step convertPrice() throws MalformedURLException {return steps.get("convertPrice").<TickerData, TickerData> chunk(5).reader(reader()).processor(processor()).writer(writer()).build();}

我将在文章末尾包含TickerPriceConversionConfig类的完整代码,以供参考,但基本上,这就是全部!

一旦定义了Spring bean并使用JobBuilderFactory和StepBuilderFactory为批处理作业和步骤创建Bean配置,就可以运行该作业并测试配置了。 为了运行作业,我们将利用Spring Boot来测试新转换的作业配置的执行情况。 为此,我们将在测试包中创建一个名为TickerPriceConversionJobRunner的新类。

源代码如下所示:

package com.keyhole.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class TickerPriceConversionJobRunner {public static void main(String[] args) {SpringApplication.run(TickerPriceConversionJobRunner.class, args);}}

@SpringBootApplication注释本质上是一个便捷注释,它提供了通常可以使用@ Configuration,@ EnableAutoConfiguration和@ComponentScan获得的功能。 TickerPriceConversionJobRunner是一个简单的Java应用程序,它将主要方法处理委托给Spring Boot的SpringApplication类来运行该应用程序。

现在,您可以将该项目导出为jar并从命令行运行TickerPriceConversionJobRunner,或者,如果您想在Spring STS中运行它,则可以右键单击该类,然后选择Run As→Spring Boot Application。

最终想法和代码清单

如您所见,创建Spring Batch作业配置并不需要很多工作,但是如果您决定将所有现有的作业从基于XML的配置转换为较新的基于JavaConfig的配置,摆在您前面的工作。 大部分工作将花费大量时间来充分回归测试转换后的批处理作业。

如果您拥有大量的Spring Batch作业库,那将值得吗? 可能不是,但是如果您刚开始使用或拥有可管理的批处理库,那么这绝对是我会采用的方法。

TickerPriceConversionConfig的代码清单

package com.keyhole.example.config;import java.net.MalformedURLException;import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.UrlResource;import com.keyhole.example.LogItemWriter;
import com.keyhole.example.TickerData;
import com.keyhole.example.TickerFieldSetMapper;
import com.keyhole.example.TickerPriceProcessor;@Configuration
@EnableBatchProcessing
public class TickerPriceConversionConfig {@Autowiredprivate JobBuilderFactory jobs;@Autowiredprivate StepBuilderFactory steps;@Beanpublic ItemReader<TickerData> reader() throws MalformedURLException {FlatFileItemReader<TickerData> reader = new FlatFileItemReader<TickerData>();reader.setResource(new UrlResource("http://finance.yahoo.com/d/quotes.csv?s=XOM+IBM+JNJ+MSFT&f=snd1ol1p2"));reader.setLineMapper(new DefaultLineMapper<TickerData>() {{setLineTokenizer(new DelimitedLineTokenizer());setFieldSetMapper(new TickerFieldSetMapper());}});return reader;}@Beanpublic ItemProcessor<TickerData, TickerData> processor() {return new TickerPriceProcessor();}@Beanpublic ItemWriter<TickerData> writer() {return new LogItemWriter();}@Beanpublic Job TickerPriceConversion() throws MalformedURLException {return jobs.get("TickerPriceConversion").start(convertPrice()).build();}@Beanpublic Step convertPrice() throws MalformedURLException {return steps.get("convertPrice").<TickerData, TickerData> chunk(5).reader(reader()).processor(processor()).writer(writer()).build();}
}

TickerPriceConversionJobRunner的代码清单

  • 代码项目
package com.keyhole.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class TickerPriceConversionJobRunner {public static void main(String[] args) {SpringApplication.run(TickerPriceConversionJobRunner.class, args);}}

翻译自: https://www.javacodegeeks.com/2015/07/spring-batch-replacing-xml-job-configuration-with-javaconfig.html

Spring Batch –使用JavaConfig替换XML作业配置相关推荐

  1. Spring Batch –用JavaConfig替换XML作业配置

    最近,我协助一个客户启动并运行了Spring Batch实现. 该团队决定继续使用针对批处理作业的基于JavaConfig的配置,而不是传统的基于XML的配置. 随着这越来越成为配置Java应用程序的 ...

  2. spring batch (四) Job的配置及配置文件说明介绍

    内容来自<Spring Batch 批处理框架>,作者:刘相. 我只是个搬运工. 一.Spring Batch提供了独立的标签用来顶一个Job配置,分别是job.step.tasklet. ...

  3. java spring bean配置文件_Spring基于xml文件配置Bean过程详解

    这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过全类名来配置: class:be ...

  4. Spring框架IOC基础及XML的配置 第二章

    1 Spring概述 1.1 关于框架 框架的概念 框架:特指软件框架,它是我们在实际开发中解决项目需求的技术集合.运用框架可以大大简化代码的编写,缩短开发周期.同时,对后续负责项目维护的人员降低技术 ...

  5. spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明

    背景: 在项目中遇到下面这个exception Exception occurred while logging on hibernate operation: Cannot open connect ...

  6. spring结合时,web.xml的配置

    <!-- 1. web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <pa ...

  7. 四 Spring的工厂类,xml的配置

    Spring工厂类的结构图: BeanFactory:老版本的工厂类 BeanFactory:调用getBean的时候,才会生产类的实例 ApplicationFactory:新版本的工厂类 加载配置 ...

  8. spring整合hibernate的applicationContext.xml文件配置以及web.xml

    applicationContext.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  9. spring +springmvc+mybatis组合springmvc.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

最新文章

  1. 强化学习(四) - 蒙特卡洛方法(Monte Carlo Methods)及实例
  2. 一条SQL要28秒 mysql_一条简单的 SQL 执行超过 1000ms,纳尼?
  3. C#怎么通过一个按钮Button,实现点击这个按钮可以打开一个文件或者文件夹?
  4. c++编程例子_如何开始厉害的C语言编程?大神都是这样开始的!
  5. 深度学习和目标检测系列教程 22-300:关于人体姿态常见的估计方法
  6. OpenGL缩放转换
  7. 数据结构与算法之花费铜板最小和利润最大题目
  8. React开发(243):dva概念7subscription
  9. java local_java.time.LocalDateTime with()方法
  10. drupal主题开发_Drupal开发人员,关于如何使您的网站更易于访问
  11. C++中 vector(容器)的用法
  12. 通俗易懂的monteCarlo积分方法(八)
  13. Security6:查看授予的权限
  14. idea2019.3.3不能热部署_复盘曼联2-1热刺:3大战术力助索肖自救,1人成“红魔”复苏关键...
  15. 计算电磁学中的矩量法及其求解过程介绍
  16. 玩转群晖NAS套件系列七:File Station的安装与使用保姆级教程!
  17. 网页游戏运营模式研究
  18. 解决:return _compile(pattern, flags).search(string) TypeError: expected string or buffer
  19. 按钮如何控制tab页面跳转
  20. 【Python配置】使用pyenv与virtualenv搭建单机多版本python多虚拟环境开发

热门文章

  1. 散列算法,Remal使用散列算法
  2. MySQL检索数据(过滤+通配符+正则表达式)
  3. java数据库编程——事务
  4. java泛型程序设计——Varargs 警告+不能实例化类型变量
  5. gwt格式_活性GWT
  6. rest和rest ful_还有更多REST技巧
  7. jdk 细粒度锁_使用JDK 8轻松进行细粒度排序
  8. java 精选选择题_Java生产率提示:社区精选
  9. jit编译_意外分配– JIT编译抖动
  10. 不可变集合相比可变集合_简单的基准测试:不可变集合VS持久集合