利用Java并发包实现高效可靠流水线任务处理模型

问题描述:

    批量的数据,现在需要从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)
    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: 每个完整数据块包含:[线程名,时间戳,方法栈列表,方法栈深度;换行分隔符]
   eg :

解决代码示例如下(部分业务逻辑还未完成) 




 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值