日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Batch中的块处理

發布時間:2023/12/3 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Batch中的块处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大數據集的處理是軟件世界中最重要的問題之一。 Spring Batch是一個輕量級且強大的批處理框架,用于處理數據集。

Spring Batch Framework提供了“面向TaskletStep”和“面向塊”的處理風格。 在本文中,將解釋面向塊的處理模型。 此外,絕對建議在Spring Batch中使用面向TaskletStep的處理在本文中,絕對建議您研究如何在Spring Batch中開發面向TaskletStep的處理。

Spring Batch v2.0附帶了面向塊的處理功能。 它是指一次讀取一個數據,并在事務邊界內創建要寫出的“塊”。 從ItemReader讀取一項,并將其交給ItemProcessor并寫入。 一旦讀取的項目數等于提交間隔,就通過ItemWriter寫入整個塊,然后提交事務。

基本上,如果需要至少一個數據項的讀寫,則應使用此功能。 否則,如果只需要讀取或寫入數據項,則可以使用面向TaskletStep的處理。

面向塊的處理模型通過org.springframework.batch.item包公開了三個重要的接口,分別是ItemReaderItemProcessorItemWriter

  • 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中。

<properties><spring.version>3.1.3.RELEASE</spring.version><spring-batch.version>2.1.9.RELEASE</spring-batch.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework.batch</groupId><artifactId>spring-batch-core</artifactId><version>${spring-batch.version}</version></dependency><!-- Hibernate dependencies --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.1.8.Final</version></dependency><!-- Tomcat DBCP --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jdbc</artifactId><version>7.0.27</version></dependency><!-- MySQL Java Connector library --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.17</version></dependency><!-- Log4j library --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>

maven-compiler-plugin (Maven插件)用于使用JDK 1.7編譯項目

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.0</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin>

以下Maven插件可用于創建runnable-jar

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><configuration><source>1.7</source><target>1.7</target></configuration><transformers><transformerimplementation='org.apache.maven.plugins.shade.resource. ManifestResourceTransformer'><mainClass>com.onlinetechvision.exe.Application</mainClass></transformer><transformerimplementation='org.apache.maven.plugins.shade.resource. AppendingTransformer'><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation='org.apache.maven.plugins.shade.resource. AppendingTransformer'><resource>META-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(name='USER') public class User {private int id;private String name;private String surname;@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name='ID', unique = true, nullable = false)public int getId() {return id;}public void setId(int id) {this.id = id;}@Column(name='NAME', unique = true, nullable = false)public String getName() {return name;}public void setName(String name) {this.name = name;}@Column(name='SURNAME', 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**/List<User> 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 List<User> getUsers() {List<User> 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*/List<User> 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 List<User> 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_0,firstsurname_0)
2)再次調用firstTestReader以讀取第二個項目(firstname_1,firstsurname_1)
3)調用testProcessor處理第一項(FIRSTNAME_0,FIRSTSURNAME_0) 4)調用testProcessor處理第二個項目(FIRSTNAME_1,FIRSTSURNAME_1) 5)調用testWriter將第一項(FIRSTNAME_0,FIRSTSURNAME_0)寫入數據庫 6)調用testWriter將第二項(FIRSTNAME_1,FIRSTSURNAME_1)寫入數據庫 7)提交第一項和第二項,并且關閉交易。 調用firstTestReader以讀取第三項(firstname_2,firstsurname_2) 9)firstTestReader的maxIndex值為3。read方法返回null,并且項讀取操作完成。 10)調用testProcessor處理第三項(FIRSTNAME_2,FIRSTSURNAME_2) 11)調用testWriter將第一項(FIRSTNAME_2,FIRSTSURNAME_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 ItemReader<User> {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 ItemReader<User> {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 ItemProcessor<User, 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 ItemWriter<User> {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.driverClassName=com.mysql.jdbc.Driver jdbc.db.url=jdbc:mysql://localhost:3306/onlinetechvision jdbc.db.username=root jdbc.db.password=root jdbc.db.initialSize=10 jdbc.db.minIdle=3 jdbc.db.maxIdle=10 jdbc.db.maxActive=10 jdbc.db.testWhileIdle=true jdbc.db.testOnBorrow=true jdbc.db.testOnReturn=true jdbc.db.initSQL=SELECT 1 FROM DUAL jdbc.db.validationQuery=SELECT 1 FROM DUAL jdbc.db.timeBetweenEvictionRunsMillis=30000

步驟16:創建dataContext.xml

Spring配置文件dataContext.xml已創建。 它涵蓋了dataSource,sessionFactory和transactionManager定義。

<?xml version='1.0' encoding='UTF-8'?> <beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:context='http://www.springframework.org/schema/context'xmlns:p='http://www.springframework.org/schema/p'xmlns:batch='http://www.springframework.org/schema/batch'xmlns:tx='http://www.springframework.org/schema/tx'xsi:schemaLocation='http://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.xsd'><context:property-placeholder location='classpath:jdbc.properties'/><!-- Enable the configuration of transactional behavior based on annotations --><tx:annotation-driven transaction-manager='transactionManager'/><!-- Data Source Declaration --><bean id='dataSource' class='org.apache.tomcat.jdbc.pool.DataSource' destroy-method='close'p: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 id='sessionFactory' class='org.springframework.orm.hibernate4.LocalSessionFactoryBean'><property name='dataSource' ref='dataSource' /><property name='annotatedClasses'><list><value>com.onlinetechvision.user.User</value></list></property><property name='hibernateProperties'><props><prop key='hibernate.dialect'>org.hibernate.dialect.MySQLDialect</prop><prop key='hibernate.show_sql'>true</prop></props></property></bean><!-- Transaction Manager Declaration --><bean id='transactionManager' class='org.springframework.orm.hibernate4.HibernateTransactionManager'><property name='sessionFactory' ref='sessionFactory'/></bean></beans>

步驟17:創建jobContext.xml

Spring配置文件jobContext.xml已創建。 它涵蓋jobRepository,jobLauncher,項目讀取器,項目處理器,項目編寫器,tasklet和作業定義。

<?xml version='1.0' encoding='UTF-8'?> <beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:batch='http://www.springframework.org/schema/batch'xsi:schemaLocation='http://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.xsd'><import resource='dataContext.xml'/><!-- jobRepository Declaration --><bean id='jobRepository' class='org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean'><property name='transactionManager' ref='transactionManager' /></bean><!-- jobLauncher Declaration --><bean id='jobLauncher' class='org.springframework.batch.core.launch.support.SimpleJobLauncher' ><property name='jobRepository' ref='jobRepository'/></bean><!-- Reader Bean Declarations --><bean id='firstTestReader' class='com.onlinetechvision.item.TestReader'><property name='maxIndex' value='2'/><property name='namePrefix' value='firstname'/><property name='surnamePrefix' value='firstsurname'/></bean><bean id='secondTestReader' class='com.onlinetechvision.item.TestReader'><property name='maxIndex' value='2'/><property name='namePrefix' value='secondname'/><property name='surnamePrefix' value='secondsurname'/></bean><bean id='thirdTestReader' class='com.onlinetechvision.item.TestReader'><property name='maxIndex' value='3'/><property name='namePrefix' value='thirdname'/><property name='surnamePrefix' value='thirdsurname'/></bean><bean id='fourthTestReader' class='com.onlinetechvision.item.TestReader'><property name='maxIndex' value='3'/><property name='namePrefix' value='fourthname'/><property name='surnamePrefix' value='fourthsurname'/></bean><bean id='fifthTestReader' class='com.onlinetechvision.item.TestReader'><property name='maxIndex' value='3'/><property name='namePrefix' value='fifthname'/><property name='surnamePrefix' value='fifthsurname'/></bean><bean id='failedCaseTestReader' class='com.onlinetechvision.item.FailedCaseTestReader'><property name='maxIndex' value='1'/><property name='namePrefix' value='failedcasename'/><property name='surnamePrefix' value='failedcasesurname'/></bean><!-- Processor Bean Declaration --><bean id='testProcessor' class='com.onlinetechvision.item.TestProcessor' /><!-- Writer Bean Declaration --><bean id='testWriter' class='com.onlinetechvision.item.TestWriter' ><property name='userService' ref='userService'/></bean><!-- Failed Step Tasklet Declaration --><bean id='failedStepTasklet' class='com.onlinetechvision.tasklet.FailedStepTasklet'><property name='taskResult' value='Error occurred!' /></bean> <!-- Batch Job Declarations --><batch:job id='firstJob'><batch:step id='firstStep' next='secondStep'><batch:tasklet><batch:chunk reader='firstTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet></batch:step><batch:step id='secondStep'><batch:tasklet><batch:chunk reader='secondTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet></batch:step></batch:job><batch:job id='secondJob'><batch:step id='thirdStep'><batch:tasklet><batch:chunk reader='thirdTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet><batch:next on='*' to='fourthStep' /><batch:next on='FAILED' to='firstFailedStep' /></batch:step><batch:step id='fourthStep'><batch:tasklet><batch:chunk reader='fourthTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet></batch:step><batch:step id='firstFailedStep'><batch:tasklet ref='failedStepTasklet' /></batch:step></batch:job><batch:job id='thirdJob'><batch:step id='fifthStep'><batch:tasklet><batch:chunk reader='failedCaseTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet><batch:next on='*' to='sixthStep' /><batch:next on='FAILED' to='secondFailedStep' /></batch:step><batch:step id='sixthStep'><batch:tasklet><batch:chunk reader='fifthTestReader' processor='testProcessor' writer='testWriter' commit-interval='2'/></batch:tasklet></batch:step><batch:step id='secondFailedStep'><batch:tasklet ref='failedStepTasklet' /></batch:step></batch:job></beans>

步驟18:創建applicationContext.xml

Spring配置文件applicationContext.xml已創建。 它涵蓋了bean的定義。

<?xml version='1.0' encoding='UTF-8'?> <beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:batch='http://www.springframework.org/schema/batch'xsi:schemaLocation='http://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.xsd'><import resource='jobContext.xml'/><!-- User DAO Declaration --><bean id='userDAO' class='com.onlinetechvision.user.dao.UserDAO'><property name='sessionFactory' ref='sessionFactory' /></bean><!-- User Service Declaration --><bean id='userService' class='com.onlinetechvision.user.service.UserService'><property name='userDAO' ref='userDAO' /></bean> <!-- BatchProcessStarter Declaration --><bean id='batchProcessStarter' class='com.onlinetechvision.spring.batch.BatchProcessStarter'><property name='jobLauncher' ref='jobLauncher'/><property name='jobRepository' ref='jobRepository'/><property name='firstJob' ref='firstJob'/><property name='secondJob' ref='secondJob'/><property name='thirdJob' ref='thirdJob'/></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: [name=firstJob]] launched with the following parameters: [{}]16.12.2012 19:30:41 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=0, version=0, startTime=null, endTime=null, lastUpdated=Sun Dec 16 19:30:41 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=0, version=0, 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: id=0, version=2, startTime=Sun Dec 16 19:30:41 GMT 2012, endTime=Sun Dec 16 19:30:42 GMT 2012, lastUpdated=Sun Dec 16 19:30:42 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=0, version=0, JobParameters=[{}], Job=[firstJob]]

Second Job的控制臺輸出:

16.12.2012 19:30:42 INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=secondJob]] launched with the following parameters: [{}]16.12.2012 19:30:42 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=1, version=0, startTime=null, endTime=null, lastUpdated=Sun Dec 16 19:30:42 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0, 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: id=1, version=2, startTime=Sun Dec 16 19:30:42 GMT 2012, endTime=Sun Dec 16 19:30:42 GMT 2012, lastUpdated=Sun Dec 16 19:30:42 GMT 2012, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=1, version=0, JobParameters=[{}], Job=[secondJob]]

Third Job的控制臺輸出:

16.12.2012 19:30:42 INFO (SimpleJobLauncher.java:118) - Job: [FlowJob: [name=thirdJob]] launched with the following parameters: [{}]16.12.2012 19:30:42 DEBUG (AbstractJob.java:278) - Job execution starting: JobExecution: id=2, version=0, startTime=null, endTime=null, lastUpdated=Sun Dec 16 19:30:42 GMT 2012, status=STARTING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=2, version=0, 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: id=2, version=2, startTime=Sun Dec 16 19:30:42 GMT 2012, endTime=Sun Dec 16 19:30:43 GMT 2012, lastUpdated=Sun Dec 16 19:30:43 GMT 2012, status=FAILED, exitStatus=exitCode=FAILED;exitDescription=, job=[JobInstance: id=2, version=0, 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

總結

以上是生活随笔為你收集整理的Spring Batch中的块处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。