Terasoluna(中文)

1、靶期业务及框架基本处理流程

整体来看,靶期业务业务处理流程可分为三个环节:

前处理(Job前处理)->主处理(主要业务)->后处理(Job后处理)。

其中,前处理可能是取得靶期日付或者一些执行主处理前的准备工作,后处理主要是靶期执行结果履历更新等。

注:实际中的靶期业务处理可能只包含以上的部分环节

框架的具体执行处理流程如下图所示:

 

Fig.1 靶期业务执行流程图

描述:

整个流程由JobExecutor组件启动,然后调用JobManager组件的work方法,JobManager类是整个业务处理的核心类,靶期业务的前处理、主处理、后处理都在其work方法中完成。图中所示为主处理的执行过程,前处理和后处理均由JobManager类绑定的StandardSupportProcessor类实例调用具体的SupportLogic实现类(由用户开发)完成。主处理过程首先调用WorkQueueFactory的getWorkQueue方法生成一个指定长度的队列(Queue),然后调用一个Collector从DB或文件中取得原始数据,在取得数据过程中,Collector实现类会调用一个CollectedDataHandler接口的实现类实例(具体来说就是Chunker类)将原始数据按照一定大小(ChunkSize)对原始数据进行分组(Chunk),然后把这些分组的Chunk放到之前生成的队列里。最后,值得一提的是,这里为了表述更加方便清晰,并没有严格遵照程序实际的执行流程。实际上,在JobManager类调用WorkQueueFactory的实现类(StandardWorkQueueFactory)实例生成Chunk队列的时候,会同时提交生成指定个数(multiplicity)的队列处理线程(QueueProcessor),这些处理线程将从队列里逐个取出(take)作业单元(Chunk),然后调用JobWorker实例进行实际的业务逻辑处理。从实际的示意图上反映来看,JobManager类的两个分支(collect和process——其实是两个不同的线程)是同时都在进行的,并没有严格意义上的先后顺序之分。

注:1.这里创建的队列是Java5提供的ArrayBlockingQueue实例,是线程安全的。

2.以上描述仅为基本执行流程(不包含Partition,ControlBreak,Restart机能)。

  1. 事务处理★

事务处理主要针对DB相关的一些操作步骤(如修改、删除数据记录),贯穿了靶期业务流程的每一个环节。具体来说,框架采用了Spring提供的编程式事务管理模型,首先利用Spring IoC容器提供一个JDBC DataSourceTransanctionManager实例,然后通过注入到不同事务处理类的相应属性来提供事务处理机能。

 

1).框架提供了三种类型的事务处理模型:

  1. 以chunk为单位的事务处理
  2. 全部chunk作为单一事务处理
  3. 无事务处理

 

2).Terasoluna框架对事务处理进行了一系列静态封装,与Spring声明式事务相比,这种静态封装就是在方法调用前后(切点)静态插入了事务处理的代码。

例举抽象模型如下:

public interface Workable{

        void work();

}

public class TransanctionalWorker implements Workable{

        private Workable jobWorker = null;

        public void work(){

            beginTransanction();

            jobWorker.work();

            commit();——or rollback();

}

}

 

3).用户可根据实际业务来决定是否使用事务处理以及具体采用哪个事务处理的模型。

  1. 文件和DB操作(DI注入)

框架提供了统一的抽象封装和细节实现,由于封装抽象层次太多,在此就不进行一一列举了(可参见靶期框架说明文档)。

  1. 异常处理(ExceptionHandler) (DI注入)

框架提供统一的抽象接口及默认实现类:

JobExceptionHandler

        |——StandardJobExceptionHandler

  1. Message处理—如何获得message?

1).FileMessage:(DI注入)

框架提供统一的抽象接口及默认实现类:

MessageAccessor

        |—— MessageAccessorImpl

2).DBMessage:(……)

  1. 多线程:Why multiple threads?

多线程能够更好的工作:多线程减少了单个线程提交的更新数据量,假设更新单个数据的成功率一定,那么这样做无疑将会提高单个线程成功更新的概率。而且从执行过程来看,多线程要比单线程更为灵活有效。

 

Fig.2 多线程执行示意图

描述:

如图,多线程主要用于处理作业单元队列,具体来说,它们从队列中取得作业单元并调用具体业务逻辑处理类来进行实际的业务处理,是作业队列的消费者(Consumer)。

  1. 分割(Partition)机能

 

Fig.3 分割Job示意图

描述:

从图中很明显可以看到,整个Job被按照分割Key划分成了多个子Job进行处理。值得注意的是,这里主Job(或者叫父Job)的队列不再是存放Chunk(原始数据)了,而是存放了多个不同的PartitionRowObject(含不同的分割Key,代表了不同的子Job)。不同的子Job再从DB或者文件里以分割Key为参数取得原始数据,进一步按照ChunkSize分割成Chunk放入各自的队列里。

  1. 其他关键机能

ControlBreak机能:

  1. 类型(按break范围从小到大排列)。

1) ControlBreak(Chunk内发生)

2) ChunkControlBreak(Chunk切换时发生)

3) TrunsChunkControlBreak(跨Chunk发生)

 

其中,ChunkControlBreak在对应Job里只能定义一个,其它两个可定义多个,但是TrunsChunkControlBreak必须在ChunkControlBreak存在时才能被定义。

注:以上Break处理和Transanction处理只在执行范围上有所联系,两者之间并无实际意义上的相互影响。

  1. Break执行示意图

 

Fig.4 Break机能执行示意图

描述:

图中定义了两个不同的Break Key,它们可以看做是对数据记录中不同字段的一个组合,而Break Key的值即是对应字段值的组合,当Break Key对应的相邻数据记录值不同(也就是Break Key值发生变更)时,就会调用相应的Break处理。

Restart机能:

 

Fig.5 Restart机能示意图

描述:

如图所示,Restart机能启动时,在Job完成事务处理后,如果DB数据成功更新,则会不断更新Restart管理Table相应的restart-point(其实就是处理完了或者是已经Commit的记录数)和作业内容(job context)。当错误发生以后,会重新启动执行该Job,此时会从Restart管理Table中恢复该Job的内容,并跳过之前更新的记录继续往下进行处理。最后当成功执行完毕时,还要把之前保存的相关Restart信息从DB中清除。

  1. 框架概述

从框架整体来看,整个terasoluna框架是由搭积木的方式来进行封装和开发的,底层由Spring提供各种框架和用户类的组件(也就是类的实例),用户只需开发出核心业务的实现类,然后根据业务需求对各类组件进行组装,即可实现一套处理特定业务的工作流程;而从单个实现机能来看,每个机能都有一个统一的接口,通过注入不同的实现类,就可实现不同的处理。

  1. 机能扩展

由用户开发特定机能实现类,然后在配置文件里替换原有的处理该机能的组件即可。

转载于:https://www.cnblogs.com/feifeihu/archive/2012/08/15/2640318.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归实现汉诺塔程序

[将汉诺塔]这不是线性递归,这是个非线性递归! n1 1 n2 3 n3 7 ................. n64 2的64次方减1 [这是个天文数字,就算世界上最快的计算机也解决不了 汉诺塔的复杂度是2的n次方减一 问题很复杂,恒真正解决问题的编码就…

个人博客发展前景

我最近着手写一个博客 但是发现素材很少 而且各种类型博客已经来了 特别不想有重复的内容 百般纠结呀 求各位的意见 来自 个人博客转载于:https://www.cnblogs.com/xiezewen/archive/2012/08/16/2641111.html

转 ofbiz的webservice接口提供(1)-WSDL的生成

ofbiz的service:这个是ofbiz赖以骄傲的设计方式。她可以将所有内部实体对象的CRUD都使用service的方式提供,不同系统之间可以通过互相调用service来完成业务操作。这种松耦合的方式是很多框架梦寐以求的效果。 在ofbiz4的文档中提到,如果想将…

mysql常见函数

###进阶4:常见函数一、单行函数1、字符函数concat拼接substr截取子串upper转换成大写lower转换成小写trim去前后指定的空格和字符ltrim去左边空格rtrim去右边空格replace替换lpad左填充rpad右填充instr返回子串第一次出现的索引length 获取字节个数2、数学函数round…

数组循环移位

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,…

数据结构之树概述

非线性结构: 树的定义:树(Tree)是n(n>0)个节点的有限集T。它或是空集(空树即n0),或者是非空集。 对于任意一颗非空树: (1)有且仅…

IIS7中WCF配置问题集合

1 IIS注册WCF 以管理员身份运行命令行: "C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r -y 2 问题:无法找到 ServiceHost 指令中作为服务属性值提供的类型 将网站转换为应用程序 3 无法…

解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错:scanf_s函数报错:没有为格式字符串传递足够的参数 int main() {char s1[20] "i m name";char *p1, *p2;char s3[10] {0};p1 s1;p2 s3;printf("请输入你的名字: \n");scanf_s("%s",&s3);printf("%s\n", s3);f…

Commons codec jar包详解

Commons项目中用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64, 及 hex, metaphone, soundex 等编码演算。 JavaDoc:http://www.osctools.net/apidocs/apidoc?apicommons-codec 官网下载地址:http://commons.apache.org/codec/ 使用&…

数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.qp->next; p->nextp->next->next; free(q) B.pp->next; qp->next;pq->next; free(q) C.qp->next->next; pp->next; free(q) D.pp->next-&…

使用ActionScript实现滤镜效果

使用ActionScript实现滤镜效果2009年02月24日 11:17用as做滤镜效果,每种滤镜效果对应一个类别,这些类别将来会在Macromedia\Flash 8\语系\First Run\Classes\FP8\flash\filters 这个资料夹中. 一、渐变斜角——GradientBevelFilter类别 二、投影——Drop…

已知先序和中序求后序

先序: ABCDEFGH 中序: BDCEAFHG 求后序:DECBHGFA 具体看B站郝斌视频:https://www.bilibili.com/video/BV11s41167h6?p71

微软的Surface平板电脑RT版,RT是什么缩写?|转|

http://www.guokr.com/question/240887/ 1# 其实rt是win8家族的新成员,专为arm系列处理器设计的windows 8版本,不兼容win32程序 2# zzllrr 2012-06-21 09:28:19 找到权威解答了:“RT”代表“Runtime”的意思。既Windows Runtime Library&…

对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 ()

对广义表L((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 ( ) 。 A.(e,f) B.((e,f)) C.(f) D.() 本题考查广义表的概念和特征。 广义表是线性…

USACO sec2.1 Ordered Fractions

首先两重 for 循环对可能取的值约分&#xff0c;分子分母分别存放&#xff0c;根据比较分数大小的方法排序&#xff0c;然后按顺序输出&#xff08;相同的只输出一个&#xff09;&#xff1b; /* PROG : frac1 LANG : C */ # include <stdio.h> # include <stdlib.h&g…

二维教组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为 ( )

二维教组A[12][18]采用列优先的存储方法&#xff0c;若每个元素各占3个存储单元&#xff0c;且第1个元素的地址为150&#xff0c;则元素A[9][7]的地址为 ( ) A&#xff0e;429 B&#xff0e;432 C&#xff0e;435 D&#xff0e;438 [分析] 本题考查数组元素存储地址的计算。…

python threading 两种创建方式

作用&#xff1a;建立在thread模块之上&#xff0c;可以更容易地管理多个执行线程。 通过使用线程&#xff0c;程序可以在同一个进程空间并发地运行多个操作。threading模块建立在thread的底层特性基础上&#xff0c;可以更容易地完成线程处理。 1、调用函数 要使用Thread&…

对广义表L=((a,b),c,d)进行操作tail(head(L))的结果是

对广义表L((a,b),c,d)进行操作tail(head(L))的结果是( ) A&#xff0e;&#xff08;c,d&#xff09; B&#xff0e;(d) C&#xff0e; b D&…

ScaleForm十六戒言

不知不觉&#xff0c;在不停地叫骂、哀嚎、惊叹、欢喜中&#xff0c;开发工作已经走过了一个节点了&#xff0c;UE3作为一个顶级&#xff0c;维护多年的引擎&#xff0c;层层深入后&#xff0c;发现每一块都有值得深入&#xff0c;值得改进的地方&#xff0c;平时负责一些场景&…

一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为

一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构&#xff0c;则计算该有向图中某个顶点出度的时间复杂度为( ) A&#xff0e;O(n) B&#xff0e;O(e) C&#xff0e;O(ne) …