Spring batch学习 详细配置解读(3)

摘要:
在第一章中,我们讨论了常见的作业配置。Spring批处理为我们提供了丰富的配置,包括计划任务、验证、复合侦听器、父类、重启机制等,CSV格式--˃获取动态参数文件˂!

     第一篇讲到普通job 配置 那么spring  batch 给我们提供了丰富的配置,包括定时任务,校验,复合监听器,父类,重启机制等。

             下面看一个动态设置读取文件的配置

                1.动态文件读取           

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"    
    xmlns:bean="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx"    
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd">
    <bean:import resource="classpath:ch04/job-context.xml"/>
    
    <!-- 账单作业 -->
    <job id="billJob">
        <step id="billStep">
            <tasklet transaction-manager="transactionManager">
                <chunk reader="csvItemReader" writer="csvItemWriter" 
                    processor="creditBillProcessor" commit-interval="2">
                </chunk>
            </tasklet>
        </step>
    </job>
    
    <!-- 读取信用卡账单文件,CSV格式 -->
    <bean:bean id="csvItemReader"
        class="org.springframework.batch.item.file.FlatFileItemReader" 
        scope="step">
        <bean:property name="resource" 
            value="#{jobParameters['inputResource']}"/>  获取动态参数文件
        <bean:property name="lineMapper">
            <bean:bean 
                class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <bean:property name="lineTokenizer" ref="lineTokenizer"/>
                <bean:property name="fieldSetMapper">
                    <bean:bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                        <bean:property name="prototypeBeanName" value="creditBill">
                        </bean:property>
                    </bean:bean>
                </bean:property>
            </bean:bean>
        </bean:property>
    </bean:bean>
    
    <!-- lineTokenizer -->
    <bean:bean id="lineTokenizer" 
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
        <bean:property name="delimiter" value=","/>
        <bean:property name="names">
            <bean:list>
                <bean:value>accountID</bean:value>
                <bean:value>name</bean:value>
                <bean:value>amount</bean:value>
                <bean:value>date</bean:value>
                <bean:value>address</bean:value>
            </bean:list>
        </bean:property>
    </bean:bean>
    
    <!-- 写信用卡账单文件,CSV格式 -->
    <bean:bean id="csvItemWriter" 
        class="org.springframework.batch.item.file.FlatFileItemWriter" 
        scope="step">
        <bean:property name="resource" value="file:target/ch04/outputFile.csv"/>
        <bean:property name="lineAggregator">
            <bean:bean 
                class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                <bean:property name="delimiter" value=","></bean:property>
                <bean:property name="fieldExtractor">
                    <bean:bean 
                        class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                        <bean:property name="names" 
                             value="accountID,name,amount,date,address">
                        </bean:property>
                    </bean:bean>
                </bean:property>
            </bean:bean>
        </bean:property>
    </bean:bean>
    
    <bean:bean id="creditBill" scope="prototype"
        class="com.juxtapose.example.ch04.CreditBill">
    </bean:bean>
    <bean:bean id="creditBillProcessor" scope="step"   给定生命周期 只在当前步骤
        class="com.juxtapose.example.ch04.CreditBillProcessor">
    </bean:bean>
</bean:beans>

下面看测试类。 省略基础配置和实体。

import java.util.Date;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class JobLaunchStepScope {
	
	/**
	 * 执行批处理作业.<br>
	 * @param jobPath	作业配置文件
	 * @param jobName	作业名
	 * @param builder	作业参数构造器
	 */
	public static void executeJob(String jobPath, String jobName, JobParametersBuilder builder) {
		ApplicationContext context = new ClassPathXmlApplicationContext(jobPath);
		JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
		Job job = (Job) context.getBean(jobName);
		try {
			JobExecution result = launcher.run(job, builder.toJobParameters());
			System.out.println(result.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
// adddString 添加一个参数 在配置文件读取 public static void main(String[] args) { executeJob("ch04/job/job-stepscope.xml", "billJob", new JobParametersBuilder().addDate("date", new Date()) .addString("inputResource", "classpath:ch04/data/credit-card-bill-201303.csv")); } }

  2.继承父类,包括监听,自定义自己监听。包括方便结合定时

   



<!-- 异步作业调度器 -->

<task:executor pool-size="1" />
<bean:bean
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<bean:property name="jobRepository" ref="jobRepository"/>
<bean:property name="taskExecutor" ref="executor" />
</bean:bean>

<task:scheduler pool-size="10" /> 开启定时

<!-- 每一秒钟,执行对象schedulerLauncher的launch方法一次 -->
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="schedulerLauncher" method="launch" fixed-rate="1000" />
</task:scheduled-tasks>

<bean:bean
class="com.juxtapose.example.ch04.scheduler.SchedulerLauncher">
<bean:property name="job" ref="helloworldJob" />
<bean:property name="jobLauncher" ref="jobLauncher" />
</bean:bean>


<!-- 参数校验 --> 采用默认校验 传入的时候必须携带date参数。最多传入两个 

 还有一个类支持一组校验 compositionJobParametersValitor
<bean:bean >
<bean:property name="requiredKeys" >
<bean:set>
<bean:value>date</bean:value>
</bean:set>
</bean:property>
<bean:property name="optionalKeys" >
<bean:set>
<bean:value>name</bean:value>
</bean:set>
</bean:property>
</bean:bean>


//省略头
<!-- 抽象基础Job 与java中类似--> <job id="baseJob" abstract="true"> //定义父类监听 注意abstract <listeners> <listener ref="sysoutListener"></listener> </listeners> </job> <!-- 账单作业 --> <job id="billJob" parent="baseJob"> <step id="billStep"> <tasklet transaction-manager="transactionManager"> <chunk reader="csvItemReader" writer="csvItemWriter" processor="creditBillProcessor" commit-interval="2"> </chunk> </tasklet> </step> <listeners merge="true"> //代表可以一起使用 但是如果监听异常 执行会返回失败 <listener ref="sysoutAnnotationListener"></listener> </listeners> </job> <!-- 读取信用卡账单文件,CSV格式 --> <bean:bean id="csvItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <bean:property name="resource" value="classpath:ch04/data/credit-card-bill-201303.csv"/> <bean:property name="lineMapper"> <bean:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <bean:property name="lineTokenizer" ref="lineTokenizer"/> <bean:property name="fieldSetMapper"> <bean:bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <bean:property name="prototypeBeanName" value="creditBill"> </bean:property> </bean:bean> </bean:property> </bean:bean> </bean:property> </bean:bean> <!-- lineTokenizer --> <bean:bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <bean:property name="delimiter" value=","/> <bean:property name="names"> <bean:list> <bean:value>accountID</bean:value> <bean:value>name</bean:value> <bean:value>amount</bean:value> <bean:value>date</bean:value> <bean:value>address</bean:value> </bean:list> </bean:property> </bean:bean> <!-- 写信用卡账单文件,CSV格式 --> <bean:bean id="csvItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <bean:property name="resource" value="file:target/ch04/outputFile.csv"/> <bean:property name="lineAggregator"> <bean:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> <bean:property name="delimiter" value=","></bean:property> <bean:property name="fieldExtractor"> <bean:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <bean:property name="names" value="accountID,name,amount,date,address"> </bean:property> </bean:bean> </bean:property> </bean:bean> </bean:property> </bean:bean> <bean:bean id="creditBill" scope="prototype" class="com.juxtapose.example.ch04.CreditBill"> </bean:bean> <bean:bean id="creditBillProcessor" scope="step" class="com.juxtapose.example.ch04.CreditBillProcessor"> </bean:bean> <bean:bean id="sysoutListener" class="com.juxtapose.example.ch04.listener.SystemOutJobExecutionListener"> </bean:bean> <bean:bean id="sysoutAnnotationListener" class="com.juxtapose.example.ch04.listener.SystemOut"> </bean:bean>

   使用的实体

import java.util.Map;

import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;


public class HelloWorldTasklet implements Tasklet {

    /* (non-Javadoc)
     * @see org.springframework.batch.core.step.tasklet.Tasklet#execute(org.springframework.batch.core.StepContribution, org.springframework.batch.core.scope.context.ChunkContext)
     */
    public RepeatStatus execute(StepContribution contribution,
            ChunkContext chunkContext) throws Exception {
        String jobName = chunkContext.getStepContext().getJobName();
        System.out.println("Execute job :" + jobName +".");
        JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters();
        System.out.println("JobParameters:" + jobParameterToString(jobParameters));
        return RepeatStatus.FINISHED;
    }
    
    /**
     * 转换为String类型格式.<br>
     * @param jobParameters
     * @return
     */
    private String jobParameterToString(JobParameters jobParameters){
        StringBuffer sb = new StringBuffer();
        for(Map.Entry<String, JobParameter> param : jobParameters.getParameters().entrySet()) {
            sb.append(String.format(
                "%s = %s (%s);",
                param.getKey(),param.getValue().getValue(),param.getValue().getType()
            ));
        }
        return sb.toString();
    }

}

接下来看下基础配置中的参数值

回顾下基础参数 包含三个类

jobRepository  作业工厂

datasource 数据源 当选择持久化是需要

transactionManager 事务管理器

 jobLauncher job执行者

先从jobrespository说起 摘自springbatch一书

Spring batch学习 详细配置解读(3)第1张

ItemReader  流读取摘自书本

Spring batch学习 详细配置解读(3)第2张

ItemProcessor 对读取数据处理 比如清晰转换校验等

Spring batch学习 详细配置解读(3)第3张

itemwriter

Spring batch学习 详细配置解读(3)第4张

job说明

Spring batch学习 详细配置解读(3)第5张

子元素

Spring batch学习 详细配置解读(3)第6张

我偷懒了 对不起。。。

免责声明:文章转载自《Spring batch学习 详细配置解读(3)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇okhttp添加自定义cookie最长公共前缀下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring整合Redis

Oracle:  存储数据,   使用SQL操作数据库   Java 程序作为客户端, 发送sql, 操作数据库:  jdbc Redis: key/value 内存式数据库,  存储数据,   redis: 存储热点数据   Java程序作为客户端,  jedis 使用Spring-data-redis+jedis操作redis   与Spring整合,...

iOS 设置图片imageView圆角——对图片进行裁剪

以前设置图片圆角总是把imageView设置成圆形,然后设置maskToBounds为YES,其实这样处理很消耗性能,图片多了之后比较卡,最好将图片进行裁剪后显示;这里有个分类可以用: UIImage+wiRoundedRectImage.h #import <UIKit/UIKit.h> @interface UIImage (wiR...

【abp vnext 实战系列】简单的内容管理系统:搭建框架

PS:中文文档地址 1- 生成项目的方式 1.1- 模板生成地址 https://abp.io/get-started 1.2-abp cli 命令生成 https://docs.abp.io/zh-Hans/abp/latest/Getting-Started?UI=MVC&DB=EF&Tiered=No 2-项目结构 PS:我是纯手工制...

腾讯信鸽推送Android SDK快速指南

信鸽Android SDK是一个能够提供Push服务的开发平台,提供给开发者简便、易用的API接口,方便快速接入。目前支持Android 2.2及以上版本系统。本文档将引导用户以最快的速度嵌入信鸽SDK。注册&下载SDK前往前台 信鸽首页,使用QQ号码登陆,打开注册页面,填写“应用名称”和“应用包名”(必须要跟APP一致),选择“操作系统”和“分类...

Spring声明式事务的配置~~~

/*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可。添加方法: 点击项目右键->Build Path->Add librarys:  打开Add Libraries对话框,然后选定 MyEclipse...

spring相关的问题和原因分析

1、Bean的初始化顺序导致的项目启动失败 现象:shua-video项目中引用了配置中台bp-config的SDK,然后在mq消息监听类中使用。如上使用方式,在waterService中引用了bp-config。在测试环境mq中没有消息消费时项目能正常启动,但在线上有消息消费时项目启动报错,提示找不到bp-config类。 @Component @Slf...