java批处理程序分析

最近在公司接手了一个负责维护boss的程序,这个程序是采用的java的多线程机制,对这个程序做一番分析,加深理解


这个程序是用来进行批处理的一个典型的程序,觉得对以后从事批处理应该也有借鉴意义
分为以下几步:


1.从服务器上面通过FTP方式下载文件,将下载的文件做入库操作,这个地方不是做的很好,下载文件和文件入库应该分离
感觉file_info,在file_info中有一个状态位,标识该文件现在处理的状态。


2.文件解析,从file_info表中读取文件路径,读取数据文件的内容,将文件内容入库到save_user_open


3.批处理,这里有三个线程和一个数据管理类DataManager,批处理与其他的处理步骤不一样在,在这个步骤中会同时有多个线程处理数据
三个线程分为两类

一类:数据初始化线程,这个线程负责数据的初始化,将数据库中的数据读入到DataManager持有的vector中

vector中的数据如下图:


vector中的数据元素是一个一个的列表,即vector中数据单位为一个list,list中又是存放的一个个的bean,每个list中的bean的文件序号相同。这样每个批次(一个list)单位的号码都是同一个文件中,一个文件中的号码可以放在多个list中。

一类:数据处理线程
数据处理线程分为一个控制线程和具体的业务处理线程
控制线程一次从vector中读取一个list大小的数据,启动一个处理线程来处理这个list中的数据,处理完后这个处理线程关闭

在控制线程中可以控制处理线程的数量。


处理的时候,每个线程处理一个list,当list处理完毕后,线程就结束,然后在启动一个新的线程去处理排在后面的list中的数据,假设文件1的数据分发到list1和list2中,则处理线程1和处理线程2处理完毕后,文件1就被处理了一次。



注意的两点:
1).同一个list中的bean的文件序号相同,即一个list中的数据全部是同一个文件中,文件与list是一对多的关系,一个文件中的内容
可以写入到多个list分批处理,另外一个处理线程只负责处理一个list中的数据,即处理线程与list是一对一的关系。
2).这里将一个list中的数据处理完毕以后,有两个操作
注意将file_info表中处理的记录数目更新
将save_user_open表中处理成功的数据迁移到处理的中间表save_user_open_mid


3).一次可能有处理失败的情况,比如第一次文件fileseq_1中有100个号码,第一处理的时候只处理成功80个,还有20个处理失败
那么处理后的情况就是:80个迁移到save_user_open_mid,同时file_info中主键为fileseq_1的记录的处理数目变为80
同时还有20个的记录留在save_user_open中,save_user_open表中的记录也会有一个状态,处理失败的号码会标记为未处理
对于这些处理失败的怎么办呢?
处理失败的号码标记为未处理时,其实初始化线程会再次将这些未处理的数据读入到vector队列中,然后再新启动一个线程去处理
这批失败的数据,最终经过多次处理后,最终数据都会处理成功。
当然初始化线程读取的时候只会读取当天的数据,如果有个文件中的部分号码在当天多次处理都没有全部处理成功,那这个文件中
的数据就放弃处理。


4)最终处理失败的数据情况:
save_user_open中号码的状态为处理失败,save_user_open_mid表中没有记录
如果一个文件中的数据经过一天多次处理后的情况为:90成功,10个失败,那数据库中的情况为:
file_info表中该条文件记录对应的号码总数为100,处理成功的数目为90
save_user_open表中有10条号码记录,这10条记录对应的状态为失败
save_user_open_mid表中有90个号码记录
如果不将这20个号码的处理状态标记为未处理,则这20个号码不会初始化线程读取,也不会被批处理程序处理
这三个表中的数据一致维持这样的状态


4.如果一个文件中的数据全部处理成功,那么是这样的情况
file_info表中的号码处理数=号码的总数 ,表save_user_open中序号为文件序号为fileseq_1的记录全部移入save_user_open_mid中
那这样就好处理了
查询file_info表中处理数=记录总数的文件序号
根据文件序号去save_user_open_mid表中将对应的号码读取到list数组,
遍历数组,将数组中的内容插入到save_user_open_his,写入到反馈文件,最后将save_user_open_mid表中序号为fileseq_1的数据删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值