怎么建立一个购物网站,迁移wordpress 500,专门做衬衣网站,用jsp做的可运行的网站大数据集的处理是软件世界中最重要的问题之一。 Spring Batch是一个轻量级且强大的批处理框架#xff0c;用于处理数据集。 Spring Batch Framework提供了“面向TaskletStep”和“面向块”的处理风格。 在本文中#xff0c;将解释面向块的处理模型。 此外#xff0c;绝对建… 大数据集的处理是软件世界中最重要的问题之一。 Spring Batch是一个轻量级且强大的批处理框架用于处理数据集。 Spring Batch Framework提供了“面向TaskletStep”和“面向块”的处理风格。 在本文中将解释面向块的处理模型。 此外绝对建议在Spring Batch中使用面向TaskletStep的处理在本文中绝对建议您研究如何在Spring Batch中开发面向TaskletStep的处理。 Spring Batch v2.0附带了面向块的处理功能。 它是指一次读取一个数据并在事务边界内创建要写出的“块”。 从ItemReader读取一项并将其交给ItemProcessor并写入。 一旦读取的项目数等于提交间隔就通过ItemWriter写入整个块然后提交事务。 基本上如果需要至少一个数据项的读写则应使用此功能。 否则如果只需要读取或写入数据项则可以使用面向TaskletStep的处理。 面向块的处理模型通过org.springframework.batch.item包公开了三个重要的接口分别是ItemReader ItemProcessor和ItemWriter 。 ItemReader此接口用于提供数据。 它读取将要处理的数据。 ItemProcessor此接口用于项目转换。 它处理输入对象并转换为输出对象。 ItemWriter此接口用于常规输出操作。 它写入由ItemProcessor转换的数据。 例如可以将数据写入数据库内存或输出流等。 在此示例应用程序中我们将写入数据库。 让我们看一下如何开发面向块的处理模型。 二手技术 JDK 1.7.0_09 Spring3.1.3 Spring批次2.1.9 休眠4.1.8 Tomcat JDBC 7.0.27 MySQL 5.5.8 MySQL连接器5.1.17 Maven的3.0.4 步骤1建立已完成的专案 创建一个Maven项目如下所示。 可以使用Maven或IDE插件来创建它。 步骤2图书馆 通过执行以下脚本来创建新的用户表 CREATE TABLE ONLINETECHVISION.USER (id int(11) NOT NULL AUTO_INCREMENT,name varchar(45) NOT NULL,surname varchar(45) NOT NULL,PRIMARY KEY (id)
);步骤3图书馆 首先将依赖项添加到Maven的pom.xml中。 propertiesspring.version3.1.3.RELEASE/spring.versionspring-batch.version2.1.9.RELEASE/spring-batch.version/propertiesdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependency dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework.batch/groupIdartifactIdspring-batch-core/artifactIdversion${spring-batch.version}/version/dependency!-- Hibernate dependencies --dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-core/artifactIdversion4.1.8.Final/version/dependency!-- Tomcat DBCP --dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-jdbc/artifactIdversion7.0.27/version/dependency!-- MySQL Java Connector library --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.17/version/dependency!-- Log4j library --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.16/version/dependency/dependencies maven-compiler-plugin Maven插件用于使用JDK 1.7编译项目 plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.0/versionconfigurationsource1.7/sourcetarget1.7/target/configuration/plugin 以下Maven插件可用于创建runnable-jar plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-shade-plugin/artifactIdversion2.0/versionexecutionsexecutionphasepackage/phasegoalsgoalshade/goal/goalsconfigurationconfigurationsource1.7/sourcetarget1.7/target/configurationtransformerstransformerimplementationorg.apache.maven.plugins.shade.resource.
ManifestResourceTransformermainClasscom.onlinetechvision.exe.Application/mainClass/transformertransformerimplementationorg.apache.maven.plugins.shade.resource.
AppendingTransformerresourceMETA-INF/spring.handlers/resource/transformertransformerimplementationorg.apache.maven.plugins.shade.resource.
AppendingTransformerresourceMETA-INF/spring.schemas/resource/transformer/transformers/configuration/execution/executions/plugin 步骤4建立使用者实体 用户实体已创建。 该实体将在处理后存储。 package com.onlinetechvision.user;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;/*** User Entity** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
Entity
Table(nameUSER)
public class User {private int id;private String name;private String surname;IdGeneratedValue(strategyGenerationType.AUTO)Column(nameID, unique true, nullable false)public int getId() {return id;}public void setId(int id) {this.id id;}Column(nameNAME, unique true, nullable false)public String getName() {return name;}public void setName(String name) {this.name name;}Column(nameSURNAME, unique true, nullable false)public String getSurname() {return surname;}public void setSurname(String surname) {this.surname surname;} Overridepublic String toString() {StringBuffer strBuff new StringBuffer();strBuff.append(id : ).append(getId());strBuff.append(, name : ).append(getName());strBuff.append(, surname : ).append(getSurname());return strBuff.toString();}
}步骤5建立IUserDAO介面 创建IUserDAO接口以公开数据访问功能。 package com.onlinetechvision.user.dao;import java.util.List;import com.onlinetechvision.user.User;/*** User DAO Interface** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public interface IUserDAO {/*** Adds User** param User user*/void addUser(User user);/*** Gets User List**/ListUser getUsers();
}步骤6建立UserDAO IMPL 通过实现IUserDAO接口创建UserDAO类。 package com.onlinetechvision.user.dao;import java.util.List;import org.hibernate.SessionFactory;import com.onlinetechvision.user.User;/*** User DAO** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class UserDAO implements IUserDAO {private SessionFactory sessionFactory;/*** Gets Hibernate Session Factory** return SessionFactory - Hibernate Session Factory*/public SessionFactory getSessionFactory() {return sessionFactory;}/*** Sets Hibernate Session Factory** param SessionFactory - Hibernate Session Factory*/public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory sessionFactory;}/*** Adds User** param User user*/Overridepublic void addUser(User user) {getSessionFactory().getCurrentSession().save(user);}/*** Gets User List** return List - User list*/SuppressWarnings({ unchecked })Overridepublic ListUser getUsers() {ListUser list getSessionFactory().getCurrentSession().createQuery(from User).list();return list;}} 步骤7建立IUserService介面 为服务层创建了IUserService接口。 package com.onlinetechvision.user.service;import java.util.List;import com.onlinetechvision.user.User;/**** User Service Interface** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public interface IUserService {/*** Adds User** param User user*/void addUser(User user);/*** Gets User List** return List - User list*/ListUser getUsers();
}步骤8创建UserService IMPL 通过实现IUserService接口创建UserService类。 package com.onlinetechvision.user.service;import java.util.List;import org.springframework.transaction.annotation.Transactional;import com.onlinetechvision.user.User;
import com.onlinetechvision.user.dao.IUserDAO;/**** User Service** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
Transactional(readOnly true)
public class UserService implements IUserService {IUserDAO userDAO;/*** Adds User** param User user*/Transactional(readOnly false)Overridepublic void addUser(User user) {getUserDAO().addUser(user);}/*** Gets User List**/Overridepublic ListUser getUsers() {return getUserDAO().getUsers();}public IUserDAO getUserDAO() {return userDAO;}public void setUserDAO(IUserDAO userDAO) {this.userDAO userDAO;}
}步骤9建立TestReader IMPL TestReader类是通过实现ItemReader接口创建的。 调用该类是为了读取项目。 当read方法返回null时读取操作完成。 以下步骤详细说明了如何执行firstJob。 firstjob的commit-interval值为2并执行以下步骤 1调用firstTestReader以读取第一项firstname_0firstsurname_0 2再次调用firstTestReader以读取第二个项目firstname_1firstsurname_1 3调用testProcessor处理第一项FIRSTNAME_0FIRSTSURNAME_0 4调用testProcessor处理第二个项目FIRSTNAME_1FIRSTSURNAME_1 5调用testWriter将第一项FIRSTNAME_0FIRSTSURNAME_0写入数据库 6调用testWriter将第二项FIRSTNAME_1FIRSTSURNAME_1写入数据库 7提交第一项和第二项并且关闭交易。 调用firstTestReader以读取第三项firstname_2firstsurname_2 9firstTestReader的maxIndex值为3。read方法返回null并且项读取操作完成。 10调用testProcessor处理第三项FIRSTNAME_2FIRSTSURNAME_2 11调用testWriter将第一项FIRSTNAME_2FIRSTSURNAME_2写入数据库 12第三项已提交交易已关闭。 第一步已完成状态为“已完成”第二步已开始。 secondJob和thirdJob以相同的方式执行。 package com.onlinetechvision.item;import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;import com.onlinetechvision.user.User;/*** TestReader Class is created to read items which will be processed** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class TestReader implements ItemReaderUser {private int index;private int maxIndex;private String namePrefix;private String surnamePrefix;/*** Reads items one by one** return User** throws Exception* throws UnexpectedInputException* throws ParseException* throws NonTransientResourceException**/Overridepublic User read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {User user new User();user.setName(getNamePrefix() _ index);user.setSurname(getSurnamePrefix() _ index);if(index getMaxIndex()) {return null;}incrementIndex();return user;}/*** Increments index which defines read-count** return int**/private int incrementIndex() {return index;}public int getMaxIndex() {return maxIndex;}public void setMaxIndex(int maxIndex) {this.maxIndex maxIndex;}public String getNamePrefix() {return namePrefix;}public void setNamePrefix(String namePrefix) {this.namePrefix namePrefix;}public String getSurnamePrefix() {return surnamePrefix;}public void setSurnamePrefix(String surnamePrefix) {this.surnamePrefix surnamePrefix;}}步骤10创建FailedCaseTestReader IMPL 创建FailedCaseTestReader类以模拟失败的作业状态。 在此示例应用程序中当在thirdStep处理thirdJob时将调用failedCaseTestReader并引发异常因此其状态将为FAILED。 package com.onlinetechvision.item;import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;import com.onlinetechvision.user.User;/*** FailedCaseTestReader Class is created in order to simulate the failed job status.** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class FailedCaseTestReader implements ItemReaderUser {private int index;private int maxIndex;private String namePrefix;private String surnamePrefix;/*** Reads items one by one** return User** throws Exception* throws UnexpectedInputException* throws ParseException* throws NonTransientResourceException**/Overridepublic User read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {User user new User();user.setName(getNamePrefix() _ index);user.setSurname(getSurnamePrefix() _ index);if(index getMaxIndex()) {throw new Exception(Unexpected Error!);}incrementIndex();return user;}/*** Increments index which defines read-count** return int**/private int incrementIndex() {return index;}public int getMaxIndex() {return maxIndex;}public void setMaxIndex(int maxIndex) {this.maxIndex maxIndex;}public String getNamePrefix() {return namePrefix;}public void setNamePrefix(String namePrefix) {this.namePrefix namePrefix;}public String getSurnamePrefix() {return surnamePrefix;}public void setSurnamePrefix(String surnamePrefix) {this.surnamePrefix surnamePrefix;}}步骤11创建TestProcessor IMPL 通过实现ItemProcessor接口来创建TestProcessor类。 此类称为处理项目。 从TestReader接收用户项对其进行处理并返回给TestWriter。 package com.onlinetechvision.item;import java.util.Locale;import org.springframework.batch.item.ItemProcessor;import com.onlinetechvision.user.User;/*** TestProcessor Class is created to process items.** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class TestProcessor implements ItemProcessorUser, User {/*** Processes items one by one** param User user* return User* throws Exception**/Overridepublic User process(User user) throws Exception {user.setName(user.getName().toUpperCase(Locale.ENGLISH));user.setSurname(user.getSurname().toUpperCase(Locale.ENGLISH));return user;}}步骤12建立TestWriter IMPL TestWriter类是通过实现ItemWriter接口创建的。 此类称为将项目写入DB内存等… package com.onlinetechvision.item;import java.util.List;import org.springframework.batch.item.ItemWriter;import com.onlinetechvision.user.User;
import com.onlinetechvision.user.service.IUserService;/*** TestWriter Class is created to write items to DB, memory etc...** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class TestWriter implements ItemWriterUser {private IUserService userService;/*** Writes items via list** throws Exception**/Overridepublic void write(List? extends User userList) throws Exception {for(User user : userList) {getUserService().addUser(user);}System.out.println(User List : getUserService().getUsers());}public IUserService getUserService() {return userService;}public void setUserService(IUserService userService) {this.userService userService;}}步骤13创建失败的StepTasklet类 通过实现Tasklet接口创建FailedStepTasklet 。 它说明了失败步骤中的业务逻辑。 package com.onlinetechvision.tasklet;import org.apache.log4j.Logger;
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;/*** FailedStepTasklet Class illustrates a failed job.** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class FailedStepTasklet implements Tasklet {private static final Logger logger Logger.getLogger(FailedStepTasklet.class);private String taskResult;/*** Executes FailedStepTasklet** param StepContribution stepContribution* param ChunkContext chunkContext* return RepeatStatus* throws Exception**/public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {logger.debug(Task Result : getTaskResult());throw new Exception(Error occurred!);}public String getTaskResult() {return taskResult;}public void setTaskResult(String taskResult) {this.taskResult taskResult;} }步骤14创建BatchProcessStarter类 创建BatchProcessStarter类以启动作业。 此外它记录他们的执行结果。 package com.onlinetechvision.spring.batch;import org.apache.log4j.Logger;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;/*** BatchProcessStarter Class launches the jobs and logs their execution results.** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class BatchProcessStarter {private static final Logger logger Logger.getLogger(BatchProcessStarter.class);private Job firstJob;private Job secondJob;private Job thirdJob;private JobLauncher jobLauncher;private JobRepository jobRepository;/*** Starts the jobs and logs their execution results.**/public void start() {JobExecution jobExecution null;JobParametersBuilder builder new JobParametersBuilder();try {getJobLauncher().run(getFirstJob(), builder.toJobParameters());jobExecution getJobRepository().getLastJobExecution(getFirstJob().getName(), builder.toJobParameters());logger.debug(jobExecution.toString()); getJobLauncher().run(getSecondJob(), builder.toJobParameters());jobExecution getJobRepository().getLastJobExecution(getSecondJob().getName(), builder.toJobParameters());logger.debug(jobExecution.toString());getJobLauncher().run(getThirdJob(), builder.toJobParameters());jobExecution getJobRepository().getLastJobExecution(getThirdJob().getName(), builder.toJobParameters());logger.debug(jobExecution.toString());} catch (JobExecutionAlreadyRunningException| JobRestartException| JobInstanceAlreadyCompleteException| JobParametersInvalidException e) {logger.error(e);}} public Job getFirstJob() {return firstJob;}public void setFirstJob(Job firstJob) {this.firstJob firstJob;}public Job getSecondJob() {return secondJob;}public void setSecondJob(Job secondJob) {this.secondJob secondJob;} public Job getThirdJob() {return thirdJob;}public void setThirdJob(Job thirdJob) {this.thirdJob thirdJob;}public JobLauncher getJobLauncher() {return jobLauncher;}public void setJobLauncher(JobLauncher jobLauncher) {this.jobLauncher jobLauncher;}public JobRepository getJobRepository() {return jobRepository;}public void setJobRepository(JobRepository jobRepository) {this.jobRepository jobRepository;} }步骤15创建dataContext.xml jdbc.properties已创建。 它定义数据源信息并通过dataContext.xml读取 jdbc.db.driverClassNamecom.mysql.jdbc.Driver
jdbc.db.urljdbc:mysql://localhost:3306/onlinetechvision
jdbc.db.usernameroot
jdbc.db.passwordroot
jdbc.db.initialSize10
jdbc.db.minIdle3
jdbc.db.maxIdle10
jdbc.db.maxActive10
jdbc.db.testWhileIdletrue
jdbc.db.testOnBorrowtrue
jdbc.db.testOnReturntrue
jdbc.db.initSQLSELECT 1 FROM DUAL
jdbc.db.validationQuerySELECT 1 FROM DUAL
jdbc.db.timeBetweenEvictionRunsMillis30000步骤16创建dataContext.xml Spring配置文件dataContext.xml已创建。 它涵盖了dataSourcesessionFactory和transactionManager定义。 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:phttp://www.springframework.org/schema/pxmlns:batchhttp://www.springframework.org/schema/batchxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/batchhttp://www.springframework.org/schema/batch/spring-batch-2.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdcontext:property-placeholder locationclasspath:jdbc.properties/!-- Enable the configuration of transactional behavior based on annotations --tx:annotation-driven transaction-managertransactionManager/!-- Data Source Declaration --bean iddataSource classorg.apache.tomcat.jdbc.pool.DataSource destroy-methodclosep:driverClassName${jdbc.db.driverClassName}p:url${jdbc.db.url}p:username${jdbc.db.username}p:password${jdbc.db.password}p:initialSize${jdbc.db.initialSize}p:minIdle${jdbc.db.minIdle}p:maxIdle${jdbc.db.maxIdle}p:maxActive${jdbc.db.maxActive}p:testWhileIdle${jdbc.db.testWhileIdle}p:testOnBorrow${jdbc.db.testOnBorrow}p:testOnReturn${jdbc.db.testOnReturn}p:initSQL${jdbc.db.initSQL}p:validationQuery${jdbc.db.validationQuery}p:timeBetweenEvictionRunsMillis${jdbc.db.timeBetweenEvictionRunsMillis}/ !-- Session Factory Declaration --bean idsessionFactory classorg.springframework.orm.hibernate4.LocalSessionFactoryBeanproperty namedataSource refdataSource /property nameannotatedClasseslistvaluecom.onlinetechvision.user.User/value/list/propertyproperty namehibernatePropertiespropsprop keyhibernate.dialectorg.hibernate.dialect.MySQLDialect/propprop keyhibernate.show_sqltrue/prop/props/property/bean!-- Transaction Manager Declaration --bean idtransactionManager classorg.springframework.orm.hibernate4.HibernateTransactionManagerproperty namesessionFactory refsessionFactory//bean/beans步骤17创建jobContext.xml Spring配置文件jobContext.xml已创建。 它涵盖jobRepositoryjobLauncher项目读取器项目处理器项目编写器tasklet和作业定义。 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:batchhttp://www.springframework.org/schema/batchxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/batchhttp://www.springframework.org/schema/batch/spring-batch-2.1.xsdimport resourcedataContext.xml/!-- jobRepository Declaration --bean idjobRepository classorg.springframework.batch.core.repository.support.MapJobRepositoryFactoryBeanproperty nametransactionManager reftransactionManager //bean!-- jobLauncher Declaration --bean idjobLauncher classorg.springframework.batch.core.launch.support.SimpleJobLauncher property namejobRepository refjobRepository//bean!-- Reader Bean Declarations --bean idfirstTestReader classcom.onlinetechvision.item.TestReaderproperty namemaxIndex value2/property namenamePrefix valuefirstname/property namesurnamePrefix valuefirstsurname//beanbean idsecondTestReader classcom.onlinetechvision.item.TestReaderproperty namemaxIndex value2/property namenamePrefix valuesecondname/property namesurnamePrefix valuesecondsurname//beanbean idthirdTestReader classcom.onlinetechvision.item.TestReaderproperty namemaxIndex value3/property namenamePrefix valuethirdname/property namesurnamePrefix valuethirdsurname//beanbean idfourthTestReader classcom.onlinetechvision.item.TestReaderproperty namemaxIndex value3/property namenamePrefix valuefourthname/property namesurnamePrefix valuefourthsurname//beanbean idfifthTestReader classcom.onlinetechvision.item.TestReaderproperty namemaxIndex value3/property namenamePrefix valuefifthname/property namesurnamePrefix valuefifthsurname//beanbean idfailedCaseTestReader classcom.onlinetechvision.item.FailedCaseTestReaderproperty namemaxIndex value1/property namenamePrefix valuefailedcasename/property namesurnamePrefix valuefailedcasesurname//bean!-- Processor Bean Declaration --bean idtestProcessor classcom.onlinetechvision.item.TestProcessor /!-- Writer Bean Declaration --bean idtestWriter classcom.onlinetechvision.item.TestWriter property nameuserService refuserService//bean!-- Failed Step Tasklet Declaration --bean idfailedStepTasklet classcom.onlinetechvision.tasklet.FailedStepTaskletproperty nametaskResult valueError occurred! //bean !-- Batch Job Declarations --batch:job idfirstJobbatch:step idfirstStep nextsecondStepbatch:taskletbatch:chunk readerfirstTestReader processortestProcessor writertestWriter commit-interval2//batch:tasklet/batch:stepbatch:step idsecondStepbatch:taskletbatch:chunk readersecondTestReader processortestProcessor writertestWriter commit-interval2//batch:tasklet/batch:step/batch:jobbatch:job idsecondJobbatch:step idthirdStepbatch:taskletbatch:chunk readerthirdTestReader processortestProcessor writertestWriter commit-interval2//batch:taskletbatch:next on* tofourthStep /batch:next onFAILED tofirstFailedStep //batch:stepbatch:step idfourthStepbatch:taskletbatch:chunk readerfourthTestReader processortestProcessor writertestWriter commit-interval2//batch:tasklet/batch:stepbatch:step idfirstFailedStepbatch:tasklet reffailedStepTasklet //batch:step/batch:jobbatch:job idthirdJobbatch:step idfifthStepbatch:taskletbatch:chunk readerfailedCaseTestReader processortestProcessor writertestWriter commit-interval2//batch:taskletbatch:next on* tosixthStep /batch:next onFAILED tosecondFailedStep //batch:stepbatch:step idsixthStepbatch:taskletbatch:chunk readerfifthTestReader processortestProcessor writertestWriter commit-interval2//batch:tasklet/batch:stepbatch:step idsecondFailedStepbatch:tasklet reffailedStepTasklet //batch:step/batch:job/beans步骤18创建applicationContext.xml Spring配置文件applicationContext.xml已创建。 它涵盖了bean的定义。 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:batchhttp://www.springframework.org/schema/batchxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/batchhttp://www.springframework.org/schema/batch/spring-batch-2.1.xsdimport resourcejobContext.xml/!-- User DAO Declaration --bean iduserDAO classcom.onlinetechvision.user.dao.UserDAOproperty namesessionFactory refsessionFactory //bean!-- User Service Declaration --bean iduserService classcom.onlinetechvision.user.service.UserServiceproperty nameuserDAO refuserDAO //bean !-- BatchProcessStarter Declaration --bean idbatchProcessStarter classcom.onlinetechvision.spring.batch.BatchProcessStarterproperty namejobLauncher refjobLauncher/property namejobRepository refjobRepository/property namefirstJob reffirstJob/property namesecondJob refsecondJob/property namethirdJob refthirdJob//bean /beans步骤19创建应用程序类 创建应用程序类以运行应用程序。 package com.onlinetechvision.exe;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.onlinetechvision.spring.batch.BatchProcessStarter;/*** Application Class starts the application.** author onlinetechvision.com* since 10 Dec 2012* version 1.0.0**/
public class Application {/*** Starts the application** param String[] args**/public static void main(String[] args) {ApplicationContext appContext new ClassPathXmlApplicationContext(applicationContext.xml);BatchProcessStarter batchProcessStarter (BatchProcessStarter)appContext.getBean(batchProcessStarter);batchProcessStarter.start();}}步骤20建立专案 在构建OTV_SpringBatch_Chunk_Oriented_Processing项目之后将创建OTV_SpringBatch_Chunk_Oriented_Processing-0.0.1-SNAPSHOT.jar 。 步骤21运行项目 运行创建的OTV_SpringBatch_Chunk_Oriented_Processing-0.0.1-SNAPSHOT.jar文件后将显示以下数据库和控制台输出日志 数据库截图 First Job的控制台输出 16.12.2012 19:30:41 INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [namefirstJob]] launched with the following parameters: [{}]16.12.2012 19:30:41 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id0, version0, startTimenull, endTimenull, lastUpdatedSun Dec 16 19:30:41 GMT 2012, statusSTARTING, exitStatusexitCodeUNKNOWN;exitDescription, job[JobInstance: id0, version0, JobParameters[{}], Job[firstJob]]User List : [id : 181, name : FIRSTNAME_0, surname : FIRSTSURNAME_0, id : 182, name : FIRSTNAME_1, surname : FIRSTSURNAME_1, id : 183, name : FIRSTNAME_2, surname : FIRSTSURNAME_2, id : 184, name : SECONDNAME_0, surname : SECONDSURNAME_0, id : 185, name : SECONDNAME_1, surname : SECONDSURNAME_1, id : 186, name : SECONDNAME_2, surname : SECONDSURNAME_2]16.12.2012 19:30:42 DEBUG (BatchProcessStarter.java:43) - JobExecution: id0, version2, startTimeSun Dec 16 19:30:41 GMT 2012, endTimeSun Dec 16 19:30:42 GMT 2012, lastUpdatedSun Dec 16 19:30:42 GMT 2012, statusCOMPLETED, exitStatusexitCodeCOMPLETED;exitDescription, job[JobInstance: id0, version0, JobParameters[{}], Job[firstJob]] Second Job的控制台输出 16.12.2012 19:30:42 INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [namesecondJob]] launched with the following parameters: [{}]16.12.2012 19:30:42 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id1, version0, startTimenull, endTimenull, lastUpdatedSun Dec 16 19:30:42 GMT 2012, statusSTARTING, exitStatusexitCodeUNKNOWN;exitDescription, job[JobInstance: id1, version0, JobParameters[{}], Job[secondJob]]User List : [id : 181, name : FIRSTNAME_0, surname : FIRSTSURNAME_0, id : 182, name : FIRSTNAME_1, surname : FIRSTSURNAME_1, id : 183, name : FIRSTNAME_2, surname : FIRSTSURNAME_2, id : 184, name : SECONDNAME_0, surname : SECONDSURNAME_0, id : 185, name : SECONDNAME_1, surname : SECONDSURNAME_1, id : 186, name : SECONDNAME_2, surname : SECONDSURNAME_2, id : 187, name : THIRDNAME_0, surname : THIRDSURNAME_0, id : 188, name : THIRDNAME_1, surname : THIRDSURNAME_1, id : 189, name : THIRDNAME_2, surname : THIRDSURNAME_2, id : 190, name : THIRDNAME_3, surname : THIRDSURNAME_3, id : 191, name : FOURTHNAME_0, surname : FOURTHSURNAME_0, id : 192, name : FOURTHNAME_1, surname : FOURTHSURNAME_1, id : 193, name : FOURTHNAME_2, surname : FOURTHSURNAME_2, id : 194, name : FOURTHNAME_3, surname : FOURTHSURNAME_3]16.12.2012 19:30:42 DEBUG (BatchProcessStarter.java:47) - JobExecution: id1, version2, startTimeSun Dec 16 19:30:42 GMT 2012, endTimeSun Dec 16 19:30:42 GMT 2012, lastUpdatedSun Dec 16 19:30:42 GMT 2012, statusCOMPLETED, exitStatusexitCodeCOMPLETED;exitDescription, job[JobInstance: id1, version0, JobParameters[{}], Job[secondJob]] Third Job的控制台输出 16.12.2012 19:30:42 INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [namethirdJob]] launched with the following parameters: [{}]16.12.2012 19:30:42 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id2, version0, startTimenull, endTimenull, lastUpdatedSun Dec 16 19:30:42 GMT 2012, statusSTARTING, exitStatusexitCodeUNKNOWN;exitDescription, job[JobInstance: id2, version0, JobParameters[{}], Job[thirdJob]]16.12.2012 19:30:42 DEBUG (TransactionTemplate.java:159) - Initiating transaction rollback on application exception
org.springframework.batch.repeat.RepeatException: Exception in batch process; nested exception is java.lang.Exception: Unexpected Error!
...16.12.2012 19:30:43 DEBUG (BatchProcessStarter.java:51) - JobExecution: id2, version2, startTimeSun Dec 16 19:30:42 GMT 2012, endTimeSun Dec 16 19:30:43 GMT 2012, lastUpdatedSun Dec 16 19:30:43 GMT 2012, statusFAILED, exitStatusexitCodeFAILED;exitDescription, job[JobInstance: id2, version0, JobParameters[{}], Job[thirdJob]] 步骤22下载 https://github.com/erenavsarogullari/OTV_SpringBatch_Chunk_Oriented_Processing 资源 Spring Batch中的块处理 参考 Online Technology Vision博客中来自我们JCG合作伙伴 Eren Avsarogullari的Spring Batch中面向块的处理 。 翻译自: https://www.javacodegeeks.com/2012/12/chunk-oriented-processing-in-spring-batch.html