场景说明
个人使用信用卡消费,银行定期发送银行卡消费账单,本例将模拟银行处理个人信用卡消费对账单对账,银行需要定期地把个人消费的记录导出成csv文件,然后交给对账系统处理。
主要流程:
(从credit-card-bill-201303.csv)读取数据---->处理数据----->写数据到 outputFile文件
项目结构
项目结构说明:
- CreditBill:信用卡消费记录领域对象
- CreditBillProcessor:信用卡消费记录处理类
- jobLaunch:调用批处理作业类
- jobLaunchTest:Junit单元测试,使用Spring提供的测试框架
- credit-card-bill-201303.csv:信用卡消费账单文件
- job-context.xml:定义作业基础信息
- job.xml:定义作业文件
- outputFile.xml:输出处理过后的信用卡消费账单文件
项目实现步骤详解:
1.准备credit-card-bill-201303.csv对账文件
这里我们使用csv格式的文件,该文件的每一行表示信用卡消费记录,中间用逗号分隔,分别表示:
银行卡账户、账户名、消费金额、消费日期、消费场所如下图所示:
2.定义领域对象:
为了与账单文件形成映射,需要新建信用卡消费记录对象 -CreditBill,主要属性:银行卡账户、账户名、消费金额、消费日期、消费场所
具体代码如下:
package com.my.domain;/** * 信用卡消费记录领域对象 * 该类主要用于在ItemReader读取文件数据之后转换成领域对象CreditBill, * 以便于ItemProcessoe和ItemWriter操作使用 * @author wbw * */public class CreditBill { /** * 银行账户 */ private String accountID; /** * 账户名 */ private String name; /** * 消费金额 */ private double amount; /** * 消费日期 */ private String date; /** * 消费场所 */ private String address; /** * @return the 银行账户 */ public String getAccountID() { return accountID; } /** * @param 银行账户 the accountID to set */ public void setAccountID(String accountID) { this.accountID = accountID; } /** * @return the 账户名 */ public String getName() { return name; } /** * @param 账户名 the name to set */ public void setName(String name) { this.name = name; } /** * @return the 消费金额 */ public double getAmount() { return amount; } /** * @param 消费金额 the amount to set */ public void setAmount(double amount) { this.amount = amount; } /** * @return the 消费日期 */ public String getDate() { return date; } /** * @param 消费日期 the date to set */ public void setDate(String date) { this.date = date; } /** * @return the 消费场所 */ public String getAddress() { return address; } /** * @param 消费场所 the address to set */ public void setAddress(String address) { this.address = address; } }
3.定义job-context.xml批处理基础信息
该配置文件主要是配置作业仓库、作业调度器、事务管理器,具体代码如下: