问题描述:
批量的数据,现在需要从DB/文件系统中读出一些数据,之后经过过滤,验证,转换,格式化 etc , 最终写入到文件/DB里.
解决思路:
基本上有以下两个方面 ,并行(多 JVM)+并发(多线程)。由于并行涉及到分布式处理,暂不讨论, 下面主要说的是单 JVM并发实现的情况 .这里主要通过 concurrent包里面的 BlockingQueue ,ThreadPool 以及基本的生产者消费者模型实现可靠流水线任务模型。
步骤及其需要处理的问题:
1.数据分类/分块
2.分阶段处理,(eg :load ->filter->process->persist)
3.任务线程生命周期管理(任务线程异常/结束报告,关闭任务线程)。
具体实现:
1 .MasterTask : 管理Task负责流水线的创建和工作task生命周期的管理 .
类图如下:
属性功能介绍:
1) masterQueue :此队列为MasterTask和工作Task共享, 是工作线程report的主要通道 , Mastertask循环监听来自工作线程的Msg
a) StopTaskMessage , 将工作Task 移出taskList.
b) ExceptionTaskMessage ,强制终止所有正在运行的线程,(loop taskList设置 isStop=true)
b) ExceptionTaskMessage ,强制终止所有正在运行的线程,(loop taskList设置 isStop=true)
2) taskList :这个列表主要存储正在运行的工作task .
3) exeService: 线程池
流程图:
2.AbstractInOutTask :工作线程从incoming队列读取msg经过一系列的处理将结果放入到outgoing队列.
类图如下:
属性功能介绍:
1)outgoingQueue:此队列为相邻的两个阶段的 所有工作Task共享, 用于工作线程转发Msg 到下一个阶段, 对于当前工作task而言当前task结果需要放入到这个队列上。
2) incomingQueue: 对于当前工作task而言当前task需要循环取msg从这个队列上 .
3) isStoped: 关闭开关
4) masterQueue :与MasterTask共享,参考MasterTask.
5) counter :记录当前阶段工作组task大小,用于正常情况下的工作task自结束。(接受EndTaskMsg)
流程图:
3.消息传递流程图.
测试问题示例:
现在有一些文件里面存储的是线程运行的方法栈信息,现在需要按照下面的规则将输入转换成输出,结果(按原来的顺序)写入另一个文件。
Input : 每个完整数据块包含:[线程名,时间戳,方法栈列表,换行分隔符]
Output: 每个完整数据块包含:[线程名,时间戳,方法栈列表,方法栈深度;换行分隔符]
Output: 每个完整数据块包含:[线程名,时间戳,方法栈列表,方法栈深度;换行分隔符]
eg :