Spring batch學習 詳細配置解讀(3)


     第一篇講到普通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 id="executor" pool-size="1" />
<bean:bean id="jobLauncherAsyn"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<bean:property name="jobRepository" ref="jobRepository"/>
<bean:property name="taskExecutor" ref="executor" />
</bean:bean>

<task:scheduler id="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 id="schedulerLauncher"
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 id="validator" class="org.springframework.batch.core.job.DefaultJobParametersValidator" >
<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一書

ItemReader  流讀取摘自書本

ItemProcessor 對讀取數據處理 比如清晰轉換校驗等

itemwriter

job說明

子元素

 

 

我偷懶了 對不起。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM