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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring batch 2.0例子(lineMapper)

發(fā)布時(shí)間:2024/4/17 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring batch 2.0例子(lineMapper) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/

使用 Spring Batch 構(gòu)建企業(yè)級(jí)批處理應(yīng)用: 第 1 部分

劉 光瑞, 軟件架構(gòu)師, 四達(dá)軟件 劉光瑞,現(xiàn)供職于北京四達(dá)軟件擔(dān)任軟件架構(gòu)師,長(zhǎng)期從事基于 Swing 的企業(yè)級(jí)胖客戶端應(yīng)用程序開發(fā),精通多種 Swing 開發(fā)框架,在企業(yè)級(jí)胖客戶端應(yīng)用開發(fā)上積累了豐富的經(jīng)驗(yàn)。

簡(jiǎn)介:?Spring Batch 是一款基于 Spring 的批處理框架,通過它可以輕易構(gòu)建出高內(nèi)聚、低耦合的企業(yè)批處理應(yīng)用。通過本文您可以一步步了解如何開發(fā)基于 Spring Batch 的批處理程序。同時(shí),本文還介紹了 Spring Batch 的相關(guān)核心概念。

平均分 (9個(gè)評(píng)分)
為本文評(píng)分

引言

總述

本系列文章旨在通過示例搭建以及特性介紹,詳細(xì)講述如何利用 Spring Batch 開發(fā)企業(yè)批處理應(yīng)用。本系列文章共分為三部分,第一部分初步介紹了批處理以及 Spring Batch 的相關(guān)概念,同時(shí)搭建了一個(gè)簡(jiǎn)單的基于 Spring Batch 的批處理應(yīng)用。第二部分介紹了 Step Flow 以及并發(fā)支持。第三部分則主要介紹了 Spring Batch 對(duì)任務(wù)監(jiān)控的支持。下面讓我們進(jìn)入第一部分內(nèi)容。

什么是批處理

在現(xiàn)代企業(yè)應(yīng)用當(dāng)中,面對(duì)復(fù)雜的業(yè)務(wù)以及海量的數(shù)據(jù),除了通過龐雜的人機(jī)交互界面進(jìn)行各種處理外,還有一類工作,不需要人工干預(yù),只需要定期讀入大批量數(shù)據(jù),然后完成相應(yīng)業(yè)務(wù)處理并進(jìn)行歸檔。這類工作即為“批處理”。

從上面的描述可以看出,批處理應(yīng)用有如下幾個(gè)特點(diǎn):

  • 數(shù)據(jù)量大,少則百萬,多則上億的數(shù)量級(jí)。
  • 不需要人工干預(yù),由系統(tǒng)根據(jù)配置自動(dòng)完成。
  • 與時(shí)間相關(guān),如每天執(zhí)行一次或每月執(zhí)行一次。

同時(shí),批處理應(yīng)用又明顯分為三個(gè)環(huán)節(jié):

  • 讀數(shù)據(jù),數(shù)據(jù)可能來自文件、數(shù)據(jù)庫或消息隊(duì)列等
  • 數(shù)據(jù)處理,如電信支撐系統(tǒng)的計(jì)費(fèi)處理
  • 寫數(shù)據(jù),將輸出結(jié)果寫入文件、數(shù)據(jù)庫或消息隊(duì)列等

因此,從系統(tǒng)架構(gòu)上,應(yīng)重點(diǎn)考慮批處理應(yīng)用的事務(wù)粒度、日志監(jiān)控、執(zhí)行、資源管理(尤其存在并發(fā)的情況下)。從系統(tǒng)設(shè)計(jì)上,應(yīng)重點(diǎn)考慮數(shù)據(jù)讀寫與業(yè)務(wù)處理的解耦,提高復(fù)用性以及可測(cè)試性。

什么是 Spring Batch

Spring Batch 作為 Spring 的子項(xiàng)目,是一款基于 Spring 的企業(yè)批處理框架。通過它可以構(gòu)建出健壯的企業(yè)批處理應(yīng)用。Spring Batch 不僅提供了統(tǒng)一的讀寫接口、豐富的任務(wù)處理方式、靈活的事務(wù)管理及并發(fā)處理,同時(shí)還支持日志、監(jiān)控、任務(wù)重啟與跳過等特性,大大簡(jiǎn)化了批處理應(yīng)用開發(fā),將開發(fā)人員從復(fù)雜的任務(wù)配置管理過程中解放出來,使他們可以更多地去關(guān)注核心的業(yè)務(wù)處理過程。

另外我們還需要知道,Spring Batch 是一款批處理應(yīng)用框架,不是調(diào)度框架。它只關(guān)注批處理任務(wù)相關(guān)的問題,如事務(wù)、并發(fā)、監(jiān)控、執(zhí)行等,并不提供相應(yīng)的調(diào)度功能。因此,如果我們希望批處理任務(wù)定期執(zhí)行,可結(jié)合 Quartz 等成熟的調(diào)度框架實(shí)現(xiàn)。

下面將通過一個(gè)示例詳細(xì)介紹如何使用 Spring Batch 搭建批處理應(yīng)用。這個(gè)示例比較簡(jiǎn)單,對(duì)系統(tǒng)中所有用戶發(fā)送一封繳費(fèi)提醒通知。此處,我們簡(jiǎn)單地將繳費(fèi)提醒輸出到控制臺(tái)。當(dāng)然,隨著介紹的深入,我將逐漸豐富該功能,使其最終完整展示 Spring Batch 的各種特性。


環(huán)境搭建

首先,從 Spring 官方網(wǎng)站下載 Spring Batch 發(fā)布包(見 參考資源)。本文基于 Spring Batch 2.1.6(當(dāng)前最新版本為 2.1.8)以及 Spring 2.5.6 版本構(gòu)建。我們可以看到 Spring Batch 共包含 spring-batch-core 和 spring-batch-infrastructure 兩個(gè)包。spring-batch-core 主要包含批處理領(lǐng)域相關(guān)類,而 spring-batch-infrastructure 提供了一個(gè)基礎(chǔ)訪問處理框架。

接下來,讓我們新建一個(gè) Eclipse 工程,并將 Spring Batch 以及 Spring 相關(guān)包添加到依賴環(huán)境,如 圖 1 所示


圖 1. 依賴環(huán)境

環(huán)境搭建完成后,讓我們看一下如何一步步構(gòu)建一個(gè)批處理應(yīng)用。


構(gòu)建應(yīng)用

如“引言”中所述 Spring Batch 按照關(guān)注點(diǎn)的不同,將整個(gè)批處理過程分為三部分:讀、處理、寫,從而將批處理應(yīng)用進(jìn)行合理解耦。同時(shí),Spring Batch 還針對(duì)讀、寫操作提供了多種實(shí)現(xiàn),如消息、文件、數(shù)據(jù)庫。對(duì)于數(shù)據(jù)庫,還提供了 Hibernate、iBatis、JPA 等常見 ORM 框架的讀、寫接口支持。

對(duì)象定義

首先我們需要編寫用戶以及消息類,比較簡(jiǎn)單,如清單 1 和 清單 2 所示:


清單 1. User 類
package org.springframework.batch.sample;public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;} }


清單 2. Message 類
package org.springframework.batch.sample;public class Message {private String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;} }

讀寫及處理接口

首先,所有 Spring Batch 的讀操作均需要實(shí)現(xiàn) ItemReader 接口,而且 Spring Batch 為我們提供了多種默認(rèn)實(shí)現(xiàn),尤其是基于 ORM 框架的讀接口,同時(shí)支持基于游標(biāo)和分頁兩類操作。因此,多數(shù)情況下我們并不需要手動(dòng)編寫 ItemReader 類,而是直接使用相應(yīng)實(shí)現(xiàn)類即可。

在該示例中,我們使用 org.springframework.batch.item.file.FlatFileItemReader 類從文件中進(jìn)行信息讀入,用戶信息格式定義如 清單 3 所示。


清單 3. 用戶信息
User1,20 User2,21 User3,22 User4,23 User5,24 User6,25 User7,26 User8,27 User9,28 User10,29

該類封裝了文件讀操作,僅僅需要我們手動(dòng)設(shè)置 LineMapper 與訪問文件路徑即可。Spring Batch 通過 LineMapper 可以將文件中的一行映射為一個(gè)對(duì)象。我們不難發(fā)現(xiàn),Spring Batch 將文件操作封裝為類似 Spring JDBC 風(fēng)格的接口,這也與 Spring 一貫倡導(dǎo)的接口統(tǒng)一是一致的。此處我們使用 org.springframework.batch.item.file.mapping.DefaultLineMapper 進(jìn)行行映射。讀操作的配置信息如 清單 4 所示:


清單 4. message_job.xml
<beans:bean id="messageReader" class="org.springframework.batch.item.file.FlatFileItemReader"><beans:property name="lineMapper" ref="lineMapper"></beans:property><beans:property name="resource" value="classpath:/users.txt"></beans:property> </beans:bean> <beans:bean id="lineMapper"class="org.springframework.batch.item.file.mapping.DefaultLineMapper"><beans:property name="lineTokenizer"><beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"></beans:bean></beans:property><beans:property name="fieldSetMapper"><beans:bean class="org.springframework.batch.sample.UserMapper"></beans:bean></beans:property> </beans:bean>

從清單我們可以知道,DefaultLineMapper 需要設(shè)置 lineTokenizer 和 fieldSetMapper 兩個(gè)屬性,首先通過 lineTokenizer 完成文件行拆分,并封裝為一個(gè)屬性結(jié)果集,因?yàn)槲覀兪褂谩?”分隔用戶屬性,所以需要將 lineTokenizer 設(shè)置為 DelimitedLineTokenizer。最后通過 fieldSetMapper 完成將結(jié)果集封裝為一個(gè) POJO 對(duì)象。具體實(shí)現(xiàn)如 清單 5 所示:


清單 5. UserMapper 類
package org.springframework.batch.sample;import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.validation.BindException;public class UserMapper implements FieldSetMapper<User> {public User mapFieldSet(FieldSet fs) throws BindException {User u = new User();u.setName(fs.readString(0));u.setAge(fs.readInt(1));return u;} }

該接口的實(shí)現(xiàn)方式與 Spring JDBC 的 RowMapper 極其相似。

接下來,再讓我們看一下如何實(shí)現(xiàn)寫操作。Spring Batch 所有寫操作均需要實(shí)現(xiàn) ItemWriter 接口。該接口只有一個(gè)方法 void write(List<? extends T> items),參數(shù)是輸出結(jié)果的列表。之所以如此定義,是為了便于我們進(jìn)行批量操作,以提高性能。每次傳入的列表由事務(wù)提交粒度確定,也就是說 Spring Batch 每次將提交的結(jié)果集傳入寫操作接口。因?yàn)槲覀円龅膬H僅是將繳費(fèi)通知輸出到控制臺(tái),所以,寫操作實(shí)現(xiàn)如 清單 6 所示:


清單 6. MessagesItemWriter 類
package org.springframework.batch.sample;import java.util.List; import org.springframework.batch.item.ItemWriter;public class MessagesItemWriter implements ItemWriter<Message>{public void write(List<? extends Message> messages) throws Exception {System.out.println("write results");for (Message m : messages) {System.out.println(m.getContent());}} }

同 ItemReader 一樣,Spring Batch 也為我們提供了多樣的寫操作支持,具體可閱讀 Spring Batch 參考手冊(cè),此處不再贅述。

最后,再看一下如何實(shí)現(xiàn)業(yè)務(wù)處理。Spring Batch 提供了 ItemProcessor 接口用于完成相應(yīng)業(yè)務(wù)處理。在本示例中,即為根據(jù)用戶信息生成一條繳費(fèi)通知信息,如 清單 7 所示:


清單 7. MessagesItemProcessor 類
package org.springframework.batch.sample;import org.springframework.batch.item.ItemProcessor;public class MessagesItemProcessor implements ItemProcessor<User, Message> {public Message process(User user) throws Exception {Message m = new Message();m.setContent("Hello " + user.getName()+ ",please pay promptly at the end of this month.");return m;}}

任務(wù)定義

通過上面一節(jié),我們已經(jīng)完成了批處理任務(wù)的讀數(shù)據(jù)、處理過程、寫數(shù)據(jù)三個(gè)過程。那么,我們?nèi)绾螌⑦@三部分結(jié)合在一起完成批處理任務(wù)呢?

Spring Batch 將批處理任務(wù)稱為一個(gè) Job,同時(shí),Job 下分為多個(gè) Step。Step 是一個(gè)獨(dú)立的、順序的處理步驟,包含該步驟批處理中需要的所有信息。多個(gè)批處理 Step 按照一定的流程組成一個(gè) Job。通過這樣的設(shè)計(jì)方式,我們可以靈活配置 Job 的處理過程。

接下來,讓我們看一下如何配置繳費(fèi)通知的 Job,如 清單 8 所示:


清單 8. message_job.xml
<job id="messageJob"><step id="messageStep"><tasklet><chunk reader="messageReader" processor="messageProcessor" writer="messageWriter" commit-interval="5" chunk-completion-policy=""></chunk></tasklet></step> </job>

如上,我們定義了一個(gè)名為“messageJob”的 Job,該 Job 僅包含一個(gè) Step。在配置 Step 的過程中,我們不僅要指定讀數(shù)據(jù)、處理、寫數(shù)據(jù)相關(guān)的 bean,還要指定 commit-interval 和 chunk-completion-policy 屬性。前者指定了該 Step 中事務(wù)提交的粒度,取值為 5 即表明每當(dāng)處理完畢讀入的 5 條數(shù)據(jù)時(shí),提交一次事務(wù)。后者指定了 Step 的完成策略,即當(dāng)什么情況發(fā)生時(shí)表明該 Step 已經(jīng)完成,可以轉(zhuǎn)入后續(xù)處理。由于沒有明確指定相應(yīng)的類,Spring Batch 使用默認(rèn)策略,即當(dāng)讀入數(shù)據(jù)為空時(shí)認(rèn)為 Step 結(jié)束。

最后,我們還需要配置一個(gè) JobRepository 并為其指定一個(gè)事務(wù)管理器,該類用于對(duì) Job 進(jìn)行管理,如 清單 9 所示:


清單 9. message_job.xml
<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"><beans:property name="transactionManager" ref="transactionManager" /> </beans:bean><beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

因?yàn)槲覀冋麄€(gè)示例不需要數(shù)據(jù)庫操作,所以選擇了使用 MapJobRepositoryFactoryBean 和 ResourcelessTransactionManager。

所有配置完成以后,進(jìn)入最后一步——任務(wù)執(zhí)行。

任務(wù)執(zhí)行

那么如何運(yùn)行一個(gè) Job 呢? Spring Batch 提供了 JobLauncher 接口用于運(yùn)行 Job,并提供了一個(gè)默認(rèn)實(shí)現(xiàn) SimpleJobLauncher。先讓我們看一下具體執(zhí)行代碼,如 清單 10 所示:


清單 10. Main 類
public class Main {public static void main(String[] args) {ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("message_job.xml");SimpleJobLauncher launcher = new SimpleJobLauncher();launcher.setJobRepository((JobRepository) c.getBean("jobRepository"));launcher.setTaskExecutor(new SimpleAsyncTaskExecutor());try {launcher.run((Job) c.getBean("messageJob"), new JobParameters());} catch (Exception e) {e.printStackTrace();}} }

首先,我們需要為 JobLauncher 指定一個(gè) JobRepository,該類負(fù)責(zé)創(chuàng)建一個(gè) JobExecution 對(duì)象來執(zhí)行 Job,此處直接從上下文獲取即可。其次,需要指定一個(gè)任務(wù)執(zhí)行器,我們使用 Spring Batch 提供的 SimpleAsyncTaskExecutor。最后,通過 run 方法來執(zhí)行指定的 Job,該方法包含兩個(gè)參數(shù),需要執(zhí)行的 Job 以及執(zhí)行參數(shù)。您可以通過運(yùn)行示例工程查看運(yùn)行結(jié)果。由于 MessageItemWriter 在每次輸出結(jié)果前,先打印了一行提示,因此您可以明顯看出輸出分 2 組進(jìn)行打印,即事務(wù)被提交了 2 次(因?yàn)槲覀冊(cè)O(shè)置的事務(wù)粒度為 5。)。

從業(yè)務(wù)功能上考慮,同一任務(wù)應(yīng)該盡量避免重復(fù)執(zhí)行(即相同條件下的任務(wù)只能成功運(yùn)行一次),試想如果本示例中發(fā)送繳費(fèi)通知過多只能導(dǎo)致用戶不滿,那么電信計(jì)費(fèi)批處理任務(wù)重復(fù)執(zhí)行則將導(dǎo)致重復(fù)計(jì)費(fèi),從而使用戶遭受損失。幸運(yùn)的是,Spring Batch 已經(jīng)為我們考慮好了這些。

對(duì)于 Spring Batch 來說,JobParameters 相同的任務(wù)只能成功運(yùn)行一次。您如果在示例 Main 類中連續(xù)運(yùn)行同一 Job,將會(huì)得到如下異常(見 清單 11 ):


清單 11. 異常信息
org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={}. If you want to run this job again, change the parameters.

因此,如果我們希望該任務(wù)是周期執(zhí)行的(如每月執(zhí)行一次),那么必須保證周期內(nèi)參數(shù)是唯一。假如該客戶要求我們每月為用戶發(fā)送一次繳費(fèi)通知。我們的任務(wù)執(zhí)行可以如 清單 12 所示:


清單 12. Main 類
Map<String,JobParameter> parameters = new HashMap<String,JobParameter>(); parameters.put(RUN_MONTH_KEY,new JobParameter("2011-10")); launcher.run((Job) c.getBean("messageJob"),new JobParameters(parameters)); parameters.put(RUN_MONTH_KEY,new JobParameter("2011-11")); launcher.run((Job) c.getBean("messageJob"),new JobParameters(parameters));

在示例中,我將執(zhí)行月份作為 Job 的參數(shù)傳入,分別執(zhí)行了 10、11 月兩個(gè)月的任務(wù)。

任務(wù)重試

既然相同參數(shù)的任務(wù)只能成功執(zhí)行一次,那么,如果任務(wù)失敗該如何處理?此時(shí),需要考慮的是,既然任務(wù)步驟有事務(wù)提交粒度,那么可能任務(wù)已經(jīng)提交了部分處理結(jié)果,這部分不應(yīng)該被重復(fù)處理。也就是說,此時(shí)應(yīng)該有重試操作。

在 Spring Batch 中,通過配置可以實(shí)現(xiàn)步驟 Step 的重試,如 清單 13 所示:


清單 13. message_job.xml
<job id="messageJob" restartable="true"><step id="messageStep"><tasklet><chunk reader="messageReader" processor="messageProcessor" writer="messageWriter"commit-interval="5" chunk-completion-policy="" retry-limit="2"><retryable-exception-classes><include class="java.lang.RuntimeException" /></retryable-exception-classes></chunk></tasklet></step> </job>

我們可以看到,主要分兩部分:首先,需要設(shè)置重試次數(shù),其次是當(dāng)執(zhí)行過程中捕獲到哪些異常時(shí)需要重試。如果在執(zhí)行過程中捕獲到重試異常列表中的異常信息,則進(jìn)行重試操作。如果重試操作達(dá)到最大次數(shù)仍提示異常,則認(rèn)為任務(wù)執(zhí)行失敗。對(duì)于異常信息的配置,除了通過 include 配置包含列表外,也可以通過 exclude 配置排除列表。

由于通過配置進(jìn)行的 Step 重試是自動(dòng)的,因此較難控制(多用于網(wǎng)絡(luò)訪問異常等不需要人工干預(yù)的情況)。可以考慮一下本示例,如果有一個(gè)用戶的信息有問題,名字為空,不能發(fā)送繳費(fèi)通知,步驟重試便不合適了,此時(shí)我們可以對(duì) Job 進(jìn)行重試操作。

Spring Batch 允許重復(fù)執(zhí)行未成功的 Job,而每次執(zhí)行即為一次重試操作。示例代碼如 清單 14 所示:


清單 14. Main 類
Map<String,JobParameter> parameters = new HashMap<String,JobParameter>(); parameters.put(RUN_MONTH_KEY,new JobParameter("2011-10")); launcher.run((Job) c.getBean("messageJob"),new JobParameters(parameters)); Thread.sleep(10000); launcher.run((Job) c.getBean("messageJob"),new JobParameters(parameters));

您可以通過如下步驟查看運(yùn)行結(jié)果:首先,將 users.txt 文件中的第 7 行(之所以指定該行,便于驗(yàn)證事務(wù)提交以及重復(fù)執(zhí)行的起始位置)的用戶名修改為空。其次,運(yùn)行示例。最后,在程序出現(xiàn)異常提示時(shí),更新第 7 行的用戶名(為了便于演示,程序在兩次任務(wù)執(zhí)行過程中等待 10 秒鐘)。

您可以在控制臺(tái)中很明顯的看到,任務(wù)先打印了 5 條記錄(第一次事務(wù)提交),然后出現(xiàn)異常信息,待我們將錯(cuò)誤更正后,又打印了 5 條記錄,任務(wù)最終成功完成。

從輸出結(jié)果,我們可以知道 Spring Batch 是從出錯(cuò)的事務(wù)邊界內(nèi)第一條記錄重復(fù)執(zhí)行的,這樣便確保了數(shù)據(jù)完整性,而且所有這一切對(duì)于用戶均是透明的。

那么 Spring Batch 是如何做到這一步的呢?這與 Spring Batch 的運(yùn)行時(shí)管理是分不開的。


運(yùn)行時(shí)管理

Spring Batch 提供了如 表 1 所示的類用于記錄每個(gè) Job 的運(yùn)行信息:


表 1. 運(yùn)行時(shí)類信息
類名描述
JobInstance該類記錄了 Job 的運(yùn)行實(shí)例。舉例:10 月和 11 月分別執(zhí)行同一 Job,將生成兩個(gè) JobInstance。主要信息有:標(biāo)識(shí)、版本、Job 名稱、Job 參數(shù)
JobExecution該類記錄了 Job 的運(yùn)行記錄。如上面的示例,Job 第一次運(yùn)行失敗,第二次運(yùn)行成功,那么將形成兩條運(yùn)行記錄,但是對(duì)應(yīng)的是同一個(gè)運(yùn)行實(shí)例。主要信息有:Job 的運(yùn)行時(shí)間、運(yùn)行狀態(tài)等。
JobParameters該類記錄了 Job 的運(yùn)行參數(shù)
ExecutionContext該類主要用于開發(fā)人員存儲(chǔ)任務(wù)運(yùn)行過程中的相關(guān)信息(以鍵值對(duì)形式),主要分為 Job 和 Step 兩個(gè)范圍
StepExecution該類與 JobExecution 類似,主要記錄了 Step 的運(yùn)行記錄。包括此次運(yùn)行讀取記錄條數(shù)、輸出記錄條數(shù)、提交次數(shù)、回滾次數(shù)、讀跳過條數(shù)、處理跳過條數(shù)、寫跳過條數(shù)等信息

Spring Batch 通過 JobRepository 接口維護(hù)所有 Job 的運(yùn)行信息,此外 JobLauncher 的 run 方法也返回一個(gè) JobExecution 對(duì)象,通過該對(duì)象可以方便的獲得 Job 其他的運(yùn)行信息,代碼如 清單 15 所示:


清單 15. Main 類
Map<String,JobParameter> parameters = new HashMap<String,JobParameter>(); parameters.put(RUN_MONTH_KEY,new JobParameter("2011-10")); JobExecution je = launcher.run((Job) c.getBean("messageJob"),new JobParameters(parameters)); System.out.println(je); System.out.println(je.getJobInstance()); System.out.println(je.getStepExecutions());

輸出信息如 清單 16 所示:


清單 16. 輸出結(jié)果
JobExecution: id=0, version=2, startTime=Tue Nov 15 21:00:09 CST 2011, endTime=Tue Nov 15 21:00:09 CST 2011, lastUpdated=Tue Nov 15 21:00:09 CST 2011, status=COMPLETED, exitStatus=exitCode=COMPLETED;exitDescription=, job=[JobInstance: id=0, version=0, JobParameters=[{run.month=2011-10}], Job=[messageJob]]JobInstance: id=0, version=0, JobParameters=[{run.month=2011-10}], Job=[messageJob] [StepExecution: id=1, version=5, name=messageStep, status=COMPLETED, exitStatus=COMPLETED, readCount=10, filterCount=0, writeCount=10 readSkipCount=0,writeSkipCount=0, processSkipCount=0, commitCount=3 , rollbackCount=0, exitDescription=]

從日志您可以發(fā)現(xiàn)事務(wù)一共提交了 3 次,這與前面的說明是不一致的。之所以會(huì)如此是因?yàn)楫?dāng)事務(wù)提交粒度恰好可以被記錄數(shù)整除時(shí),事務(wù)會(huì)有一次空提交。

關(guān)于 Spring Batch 運(yùn)行時(shí)信息管理,將在講解 Job 監(jiān)控時(shí)再詳細(xì)介紹,此處不再贅述,你也可以查看 Spring Batch 參考資料了解相關(guān)信息。


總結(jié)

本文通過一個(gè)簡(jiǎn)單示例演示了如何構(gòu)建 Spring Batch 應(yīng)用,同時(shí)介紹了 Spring Batch 的相關(guān)核心概念。希望您通過本文可以掌握 Spring Batch 的基本功能。在接下來的文章中,我將繼續(xù)介紹 Spring Batch 的兩個(gè)重要特性:Job 流和并發(fā)。



下載

描述名字大小下載方法
示例代碼batch_sample.zip34KBHTTP

關(guān)于下載方法的信息


參考資料

學(xué)習(xí)

  • Spring Batch 主頁,可以初步了解 Spring Batch 的基本架構(gòu)。

  • Spring Batch 發(fā)布包,您可以在這里找到各個(gè)版本的 Spring Batch 發(fā)布包。

  • Spring Batch 入門,教你如何入門。

  • Spring Batch 參考手冊(cè),詳細(xì)了解 Spring Batch 框架。

  • Spring 參考手冊(cè),Spring Framework 知識(shí)學(xué)習(xí)。

  • “Spring Richclient 中的安全認(rèn)證管理”(developerWorks,2011 年 7 月):作為企業(yè)級(jí)開發(fā)框架,Spring Richclient 為我們提供了完善的安全認(rèn)證管理功能,使我們能夠方便構(gòu)建安全的企業(yè)級(jí)應(yīng)用。本文將詳細(xì)介紹 Spring Richclient 中安全認(rèn)證管理的實(shí)現(xiàn)方式以及使用方法。

  • “Struts2、Spring、Hibernate 高效開發(fā)的最佳實(shí)踐”(developerWorks,2011 年 8 月):Struts2、Spring、Hibernate(SSH)是最常用的 Java EE Web 組件層的開發(fā)技術(shù)搭配,網(wǎng)絡(luò)中和許多 IT 技術(shù)書籍中都有它們的開發(fā)教程,但是通常的教程都會(huì)讓很多程序員陷入痛苦的配置與修改配置的過程。本文利用 SSH 中的技術(shù)特性,利用 Java 反射技術(shù),按照規(guī)約優(yōu)于配置的原理,基于 SSH 設(shè)定編寫了一個(gè)通用開發(fā)框架,這使得開發(fā)者可以專注于業(yè)務(wù)邏輯的開發(fā)。

  • “如何將基于 Struts、Spring 和 Hibernate 的應(yīng)用從 Tomcat 遷移到 WebSphere Application Server”(developerWorks,2011 年 11 月):本文向讀者介紹基于 Eclipse 開發(fā)的 Struts、Spring 和 Hibernate 開源應(yīng)用和開發(fā)環(huán)境的特點(diǎn),并通過實(shí)例介紹從 Tomcat 遷移到 WebSphere 所遇到的問題及其解決方案。

  • “基于 Spring 和 iBATIS 的動(dòng)態(tài)可更新多數(shù)據(jù)源持久層”(developerWorks,2012 年 2 月):開發(fā)擁有多重?cái)?shù)據(jù)源的項(xiàng)目時(shí),經(jīng)常希望能夠通過用戶界面來動(dòng)態(tài)配置數(shù)據(jù)源。本文針對(duì)這一問題提出了創(chuàng)新的解決方案,通過使用 Spring+iBATIS 的組合,來實(shí)現(xiàn)可動(dòng)態(tài)更新的多重?cái)?shù)據(jù)源的持久層,從而可以通過用戶界面自主地管理所需的數(shù)據(jù)源。

  • developerWorks Java 技術(shù)專區(qū):這里有數(shù)百篇關(guān)于 Java 編程各個(gè)方面的文章。

討論

  • 加入 developerWorks 中文社區(qū)。查看開發(fā)人員推動(dòng)的博客、論壇、組和維基,并與其他 developerWorks 用戶交流。

關(guān)于作者

劉光瑞,現(xiàn)供職于北京四達(dá)軟件擔(dān)任軟件架構(gòu)師,長(zhǎng)期從事基于 Swing 的企業(yè)級(jí)胖客戶端應(yīng)用程序開發(fā),精通多種 Swing 開發(fā)框架,在企業(yè)級(jí)胖客戶端應(yīng)用開發(fā)上積累了豐富的經(jīng)驗(yàn)。

?

總結(jié)

以上是生活随笔為你收集整理的Spring batch 2.0例子(lineMapper)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费的理伦片在线播放 | 婷婷综合av | 一区二区三区四区五区视频 | 欧美精品自拍偷拍 | av片国产| 在线免费视频一区 | 性大片潘金莲裸体 | 97人人精品| 黄色应用在线观看 | 三级网站免费看 | 欧美大片在线免费观看 | 国产叼嘿视频在线观看 | 印度午夜性春猛xxx交 | 可以直接在线观看的av | 神马一区二区三区 | 超碰伊人久久 | 日本一区二区三区四区视频 | 久久久免费网站 | 亚洲综合伊人久久 | 亚洲精品视频网 | 色在线视频观看 | 国产精品无码久久久久成人app | h视频免费在线观看 | 国产精品视频播放 | 国产免费www | 欧美色88| 新久草视频 | 伦理片波多野结衣 | 亚洲伦理在线播放 | 嫩色av | 无码人妻h动漫 | 2018自拍偷拍 | 二区中文字幕 | 国产精品午夜未成人免费观看 | 吞精囗交69激情欧美 | 日韩久久精品 | 久久欧洲 | 成人激情视频在线 | 国产精品88| 亚洲免费色 | 视频一区 国产 | 日本黄色xxx| aa爱做片免费 | 999黄色片| 国产精品日本一区二区在线播放 | 在线日韩国产 | 玖玖伊人| av免费高清| 久久精品国产成人av | 久久免费看少妇高潮 | 欧美成人免费一级 | 午夜国产福利在线 | 黄色一级大片在线免费看产 | 久久精品国产亚洲av嫖农村妇女 | 69视频网址 | 自拍 偷拍 欧美 | 国产精品久久亚洲 | 亚洲dvd | 在线免费观看污片 | 丁香花在线影院观看在线播放 | 欧美一级免费观看 | 国产精品一区二区三区四区五区 | 久久久新| 欧美性色黄大片手机版 | 老熟妻内射精品一区 | 国产91一区在线精品 | 中文字幕日本人妻久久久免费 | 成人免费看毛片 | 免费黄色激情视频 | 亚洲免费av网站 | 久久精品免费观看 | 少妇被中出 | 日本少妇videos高潮 | xxxxwww国产| 色欲AV无码精品一区二区久久 | 亚洲免费影院 | 人人草网| 欧美一级片在线观看 | 成人123 | 欧美极品在线视频 | 成年人黄色免费视频 | 国产三级久久久久 | 久久一区欧美 | 久久网址| 免费观看在线播放 | 国产专区自拍 | 特大黑人巨交吊性xx | 永久免费在线看片 | 国产精品入口麻豆 | 极品色av | 国产最新av| a三级黄色片 | 亚洲欧美一区二区三区不卡 | 国产一区二区亚洲 | 亚洲一区欧美日韩 | 欧美日韩1区2区3区 亚洲日本精品视频 | 色一情一乱一伦一区二区三区 | 91av观看| 黄色生活毛片 |