Easybatch是一个利用JAVA编写的处理处理批量过程的开发框架。可以在github下载:
https://github.com/j-easy/easy-batch
Easybatch可以实现管道形式处理数据表和大文件,默认每次只提取100行数据到内存,等处理完,再提取下一批,这样可以节约内存空间,避免程序运行过程中的out of Memory错误。
在我们的magicube框架中,对于这个优秀的开源框架,进行了底层封装,以方便大家使用。开发工具,推荐使用netbean.8.2
对于数据库的封装如下:
/**
* 对数据库表数据进行批量处理
*
* @param fromDS 源数据库
* @param query 源数据库表的查询语句,例:select deptid, setid, descr, smg_oa_deptid from
* sysadm.PS_SMG_DEPT_SY_VW
* @param setfields
* 从源数据库取出的数据要映射为对象,需要调用setXxx(),这些字段名必须与query中的字段顺序保持一致,例如:"deptid",
* "setid", "descr", "smgOaDeptid","xxx1"
* 某些情况下源数据库表字段类型和CSV字段类型不一致,需要转换,比如字段xxx,这时需要在recordClass中增加setXxx1()函数,
* 在setXxx1()函数中调用setXxx()进行数据转换,对应的setfields中要有xxx1字段;而getfields中字段不变,还是xxx,这样会调用getXxx()函数得到相应的数据
* @param getfields
* 对象要映射到目的源中的数据或者在processor中进行数据处理时,需要调用getXxx(),例如:"deptid", "setid",
* "descr", "smgOaDeptid" ,"xxx"
* @param recordClass model类class 要映射的对象,注意:
* setfields和getfileds中的字段名字与recordClass中的字段名字保持一致(有时候model类中的字段名与数据库表的字段名不一致,比如:fields中的smgOaDeptid和insertSQL中的smg_oa_deptid)
* @param recordProcessor
* 对数据进行业务逻辑处理的实例,该实例必须实现org.easybatch.core.processor.RecordProcessor接口,如果是null,则不处理数据
* @return
*
*/
public static JobReport processTableData(DataSource fromDS, String query, String[] setfields, String[] getfields, Class recordClass, RecordProcessor recordProcessor) {
log.info("query:" + query);
log.info("setfields:" + Arrays.toString(setfields));
log.info("getfields:" + Arrays.toString(getfields));
log.info("recordClass:" + recordClass.getName());
//检查对数据进行业务逻辑处理的实例是否存在
Job job;
if (!ObjectUtils.isEmpty(recordProcessor)) {
log.info("recordProcessor:" + recordProcessor.toString());
job = aNewJob()
.reader(new JdbcRecordReader(fromDS, query))
.mapper(new JdbcRecordMapper<>(recordClass, setfields))
.processor(recordProcessor)
.build();
//Execute the job
JobExecutor jobExecutor = new JobExecutor();
JobReport jobReport = jobExecutor.execute(job);
jobExecutor.shutdown();
return jobReport;
} else {
log.error("recordProcessor can't be null!");
return null;
}
}
数据库返回结果,保存到数据保存字段类HrPushEmpl,需要定义,后面会用到。
package com.magicube.operplatform.hr.dao.model;
import java.io.Serializable;
import java.util.Date;
public class HrPushEmpl implements Serializable {
/**
* 编号
*
* @mbg.generated
*/
private Integer id;
/**
* 员工ID
*
* @mbg.generated
*/
private String emplid;
/**
* 员工主兼岗
*
* 员工主兼岗,0为主岗,其他为兼岗
*
* @mbg.generated
*/
private Integer emplRcd;
/**
* 员工姓名
*
* @mbg.generated
*/
private String name;
/**
* 业务单位编号
*
* @mbg.generated
*/
private String setid;
/**
* 部门ID
*
* @mbg.generated
*/
private String deptid;
/**
* 部门描述
*
* @mbg.generated
*/
private String deptDescr;
/**
* 映射OA组织编码
*
* @mbg.generated
*/
private String smgOaDeptid;
/**
* 人事状态
*
* 状态: - 1 代表在职 - 2 代表离职 - 3 代表退休 - 4 代表返聘
*
* 类型为(10)为1, 类型为(20)为2, 类型为(30)为1, 类型为(40)为2, 类型为(50)为3,
*
* 转换规则: 根据HR系统中的人事活动和人事状态转换为OA标准
*
*
* @mbg.generated
*/
private String smgRszt;
/**
* 用工性质 ASS--外单位离岗/协保 BOR--借用 CST--顾问 CTR--签约人员 ENP--企业 INS--事业 INT--实习生
* IST--讲师 LDP--劳务派遣 OTH--其他 PAR--兼职 PHD--博士后 RET--退休返聘 UNF--非全日制
*
* @mbg.generated
*/
private String emplClass;
/**
* 性别 0代表男 1代表女
*
* 类型为(F)为1, 类型为(M)为0, 类型为(U)为2,
*
* 转换规则: 根据HR系统标准信息接口的性别字段,将F转换为1,将M转换为0, 将U转换为2
*
* @mbg.generated
*/
private String sex;
/**
* 手机号
*
* @mbg.generated
*/
private String phone;
/**
* 手机号码
*
* @mbg.generated
*/
private String mobilePhone;
/**
* 政治
*
* @mbg.generated
*/
private String smgZhengzhi;
/**
* 民族
*
* @mbg.generated
*/
private String smgMinzu;
/**
* 籍贯
*
* @mbg.generated
*/
private String nativePlaceChn;
/**
* 邮箱
*
* @mbg.generated
*/
private String emailAddr;
/**
* 生日
*
* @mbg.generated
*/
private Date birthdate;
/**
* 学历
*
* @mbg.generated
*/
private String smgXueli;
/**
* 工作时间
*
* @mbg.generated
*/
private Date startDt;
/**
* 入职时间
*
* @mbg.generated
*/
private Date smgStartDtUnit;
/**
* 岗位
*
* @mbg.generated
*/
private String posnDescr;
/**
* 工作地点
*
* @mbg.generated
*/
private String address1;
/**
* 电话1
*
* @mbg.generated
*/
private String phone1;
/**
* 座机短号
*
* @mbg.generated
*/
private String extension;
/**
* 直线领导
*
* @mbg.generated
*/
private String supervisorId;
/**
* 证件类型 10--居民身份证 15--15位居民身份证 20--外国身份证 30--香港居民身份证 40--澳门居民身份证 50--台湾身份证
* 60--其他证件
*
* @mbg.generated
*/
private String nationalIdType;
/**
* 身份证号
*
* @mbg.generated
*/
private String nationalId;
/**
* 是否是部门负责人
*
* 0为否,1为是
*
* @mbg.generated
*/
private String smgYesNo;
/**
* 最后更新时间
*
* @mbg.generated
*/
private Long lastupddttm;
/**
* 生效日期
*
* @mbg.generated
*/
private Long effdt;
/**
* 是否推送
*
* 0 -- 不推送 1 -- 推送
*
* @mbg.generated
*/
private Byte ispush;
/**
* 推送状态
*
* 0--未推送 1--推送成功 2--推送失败
*
* @mbg.generated
*/
private Byte pushStatus;
/**
* 返回码 100000001--成功 100000002--失败 100000003--用户已存在 100000004--未知错误
* 100000005-用户不存在
*
* @mbg.generated
*/
private String rtncode;
/**
* 推送时间
*
* @mbg.generated
*/
private Long pushtime;
private static final long serialVersionUID = 1L;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmplid() {
return emplid;
}
public void setEmplid(String emplid) {