业务工作流平台设计(九)

自定义审核活动

         前面已经讲了许多有关自定义活动在设计上需要注意的一些事项,但对于自定义审核活动来讲,我们的设计还要有许多工作要进行。

为了简化用户的流程上的设计将流程的一些算法封装到自定义活动中可以大大增加自定义活动的使用的方便性。其直接的效果是从数十个活动减少到三四个,当然这只是针对电台文稿审核来讲的。而且基本上从根本上杜绝了IFELSEWHILE等活动的使用,这可将用户条件编辑的复杂度降为0!这种设计所带来的另一个好处就是外界应用和工作流交互的灵活性。

可能看过本系列文章中的第一篇的都还有些印象,那里面描述了新闻文稿审核的一些用户需求,如果不太清楚,大家不妨回头看一下,这里不多讲。

审核活动的两种计算模式:

l  人员数量要求。某一条件必须要有一定人员数量的参与要求。

l  权重值和要求。当某一条件的参与人员的权重值之和要达到某一数值。

两种模式中只能在一个活动实例中选择一种模式进行使用,

每种计算模式又都有下面三种类型的载体。

l  角色:可指定多个角色, 且如果在权重值和模式下角色中的每个人的权重值应来源于角色的权重值。或在人员数量要求模式下可以指定总的人员数量要求及每个角色的人员数量要求。

l  人员:可指定参与的人员列表,可有人员数量要求或权重值要求。

l  用户组:和角色的要求类似

每种计算模式中只能使用一种载体,

 

在现实情况下这些已经足够了。其它许多复杂的情况都可以分解为多个简单的活动实例来处理;这样在程序逻辑和业务管理上都是相对简单和高效的。

自定义审核活动有三个条件:

l  通过条件:满足该条件后,活动便可顺利执行完成。

l  回退条件:满足该条件后,该过程处理起来有一点复杂,下面会讲。

l  不通过条件:满足该条件后,则立即结束WF实例的运行,并从数据库中进行清除。

有人担心这三个条件会在运行时,同时满足。情况有可能是这样的,这主要是因为处理过程中没有锁定和保持状态的一致性所引起的。这个锁定不是简单的WF实例加载时的锁定,而是用于活动处理的数据收集同WF实例的联合锁定及状态持久化。

关于用户数据的收集同实例的运行进行分离并放在同一事务中保持状态的一致性及运用锁定机制和尽量减少锁定时间等话题请参阅前面的文章。

 

但是还是会有糟糕的事情发生,那就是所有的条件都不可能满足!这不是程序逻辑的功能所引起的问题,而是业务逻辑的问题。这种问题是程序无法去控制的。举个例子:如在设计时要求的人员数量大于实际的人员数量就会发生这种问题。

有关用户系统中的数据

首先我不喜欢这里所谈的问题,它涉及到自定义审核活动的通用性。自定义审核活动在设计时需要指定上面所讲的一系列属性。对于计算模式和三个条件设置来讲是比较简单的,问题出在载体上。“用户、用户组、角色”这些数据的存储与提取会因具体应用而有所不同;包括运行时审核数据的提取都是一个紧耦合的问题。如果要进行松耦合,这里必须要进行相应的映射和转换处理才可以。这会对部署和二次开发带来额外的要求!

但这是值得的,为此我们需要强制定义数据的形态(:)类型)以接收标准的数据(相对于自定义审核活动来讲)。而由应用来做数据的提取与转换。需要说明的是,仅“用户、用户组、角色”的定义还是不够的,在运行时我们还需要把用户的审核信息也必须加以定义才可以。

 

对实例进行监视及警告

我们不能要求用户所设计的业务逻辑是没有问题的,我们也无法去阻止这种错误的发生,但我们应该有一个监视机制来提醒用户那些WF实例已经好久没有处理了。可以用WF自带的Track&Trace来实现记录WF实例运行的细节。但个人认为那样会产生很多的无用数据,而且要进行清理维护操作。其实有一种更简捷的方法来找出这些停滞了的WF实例:用户审核数据。这些数据包括用户信息,用户的审核意见及所对应的WF设计ID和自定义审核活动ID(需要单独的表来维系WF设计ID和自定义审核活动ID与审核数据的关系)。利用这些数据做一个查询窗口就可以找到“死掉”的WF实例。并给用户提供一个真正杀死WF实例的机会。

 

Level变量

这是自定义审核活动的一个公共变量,这个变量具有重要意义,它是实现回退处理、再提交、跨审的关键点。如何利用Level变量去实现这些功能先放一下。为了便于后面的理解,先讲一下Level的规则。

每一个自定义审核活动都有一个Level变量。且在设计时,进行指定。Level的值必须是一个整数值。后一个活动实例的Level值必须是前一个活动Level值与1的和。我们必须在WF设计时进行这种Level值的验证,否则上一段所提到的要实现的功能将无法正常工作!

在自定义审核活动之外我们还需要维系一个关系表,这个表包含下面的主要信息:

l  WF实例ID

l  下一个自定义审核活动的Level值,会将该值传递给WF实例中的CurrentLevel变量。

l  工件ID

记住,WF设计图里面没有IFELSEWHILE和其它非自定义审核活动。有了这张表会方便提取针对某一用户所需要运行的WF实例列表。

回退处理与再提交

WF自定义审核活动实例在运行过程中如果发现满足了回退条件,则活动会创建一个新的WF实例并将Level的值减1赋给新的WF实例并结束清除当前WF实例。不过这里有一个前提条件:只有所在的活动位于第二层或以上,才可以有回退的功能。这样处理后,前一级已经审核处理过的人员就又可以再次进行审核操作了。

这里有以下几个设计要点:

l  回退会创建新的WF实例。这可能是大家都没有想到的事情,其实这就是利用Level属性来简化这种WF设计时的工作精髓所在。从而使设计者不去关心如何在设计界面上“画出”各层之间的复杂的流转关系;而只是关心有几层,并在每层上设计相关的属性便可以了。

l  用户的审核数据必须区分不同WF实例,而不是用稿件进行区分。

l  一个稿件可以有多个WF实例与之关联

有人可能存在疑虑,一个WF实例被分成多次运行会造成数据的切割现象,其实这个问题可以这样来理解。我们用WF的目的是用它的流程“控制”而不是去注重“数据的连续”,数据的连续性其实已经由用户审核数据实现了,所以可以不必关心跨多个WF实例的问题。

跨审的实现

跨审的实现也是借助于Level属性值来工作的。只要所对应的Level值高的用户就可以提调比当前自定义审核活动Level值低的WF实例来运行。只是在运行时将其Level的值设置成该用户所对应的活动的Level值便可以了。

自定义审核活动有这么一个逻辑处理:如果当前WF实例的Level值大于当前活动的Level值则该活动直接运行完毕,以过渡到下一个活动中去;直到Level值相等时再进行审核的业务操作。

自定义审核活动与外界数据的交换

         Level是如何被改变的,这可能是大家关心的问题。在这里我们有多种方案可进行选择。

l  静态成员的访问:我们可以把要交换的数据放到一个静态成员变量中。

l  AddServiceWFRunTime(对不起,我简写了)和Host是运行在两个不同的线程中的。但WFRunTime有一个AddService的函数可以把Host中的任何东西加入到WF所在环境中去。这样WF实例可以通过GetService来得到该对象。

l  创建实例时指定参数:这个方法只能在创建时进行参数的传递,但对于多次加载的WF实例是无法重新指定这些参数的。

l  communication services interfaces:这是WF SDK里面的东西。主要用于事件和方法,所以最好不要用。

对于Level来讲回退里可用指定的Level来创建新的WF实例;对于跨审和其它情况来讲,则在实例运行前利用第一、二两点的任何一种方法对其实例的Level进行赋值,然后再运行。

其它问题

         就现在的情况来看,用户在设计时不需要复杂的设计就可以定制一个“复杂”的审核处理流程。包括逐级递审,回退、跨审等。但这都是人为干预的审核,对于自动审核来讲还是不完善的。自动审核(不是智能审核稿件内容)是指在一定时间内如果没有人为给出审核意见,则自动递交到下一个审核层次上去。这样我们就会相中Delay活动。

         如果用Delay就会用到Listen。这会带来一个新的问题!我们的自定义活动必须要有接受外界触发的能力才可以将Delay和我们的审核活动放到Listen中去。如何做?真是两难的选择!我们如果扩展了IActivityEventListener接口,那么我们的审核活动的使用模式便会进行改变!!我不做结论,但很想听一下读者的意见

 

         写到这里,该结束了。回头看看不觉有些惭愧,平台的东西太少,模板的东西太多。本来还想写一下WF与工件的维护框架,WF设计管理框架。现在看来相对简单,就不写了。如果有什么问题,只要不是基础性的问题,我还是很愿意和大家一起讨论的。

 

完……。

转载于:https://www.cnblogs.com/llxxbb/archive/2007/06/25/BusinnessProcessPlatform9.html

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

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

相关文章

国王的魔镜

描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把…

C和汇编---数组

0x01 初始化数组 1、没有初始化数组 #include "stdio.h" int main(void) {int data[4];for (int i0;i<4;i){printf("%d\t",data[i]);}return 0; }不同系统&#xff0c;输出结果可能不一样&#xff1a; 反汇编&#xff1a; 4: int data[4]; 5…

清华大学计算机组成与体系结构,清华大学出版社-图书详情-《计算机组成与体系结构(第2版)》...

作为“21世纪大学本科计算机专业系列教材”&#xff0c;遵照本系列教材评审组专家的意见&#xff0c;本书包括了数字电路基础、计算机组成、计算机体系结构3个部分内容。本书读者对象主要是学习计算机课程的大学生&#xff0c;包括计算机系的学生、软件学院的学生和非计算机专业…

txt如何单独单独选择一列_散列| 单独链接以解决冲突

txt如何单独单独选择一列Prerequisite: Hashing data structure 先决条件&#xff1a; 哈希数据结构 单独链接 (Separate chaining) In separate chaining, we maintain a linked chain for every index in the hash table. So whenever there is a Collison the linked list …

[我研究]Behavior Based Software Theft Detection - Hawk

Xinran Wang, Yoon-Chan Jhi, Sencun Zhu, Peng LiuPSU 背景&#xff1a; Behavior Based Software Theft Detection的系统包含四个步骤&#xff1a; 1、Dynamic Analysis - 产生System Call, Call Stack, Dependences 2、Noise Filtering 3、Extract SCDG Birthmarks 4、Compa…

整除个数

描述 1、2、3… …n这n(0< n<1000000000)个数中有多少个数可以被正整数b整除。 输入 输入包含多组数据 每组数据占一行&#xff0c;每行给出两个正整数n、b。 输出 输出每组数据相应的结果。 样例输入 2 1 5 3 10 4 样例输出 2 1 2 思路&#xff1a;一开始…

2020计算机二级题库第14PPT,计算机二级考试MSOffice考精彩试题库ppt操作题附问题详解.doc...

文档介绍&#xff1a;请在【答题】菜单下选择【进入考生文件夹】命令,并按照题目要求完成下面的操作。注意:以下的文件必须保存在考生文件夹下文慧是新东方学校的人力资源培训讲师,负责对新入职的教师进行入职培训,其PowerPoint演示文稿的制作水平广受好评。最近,她应北京节水展…

操作系统 系统开销比率_操作系统中的最高响应比率下一个(HRRN)调度

操作系统 系统开销比率操作系统中的HRRN调度是什么&#xff1f; (What is HRRN Scheduling in Operating System?) HRRN is the abbreviation of Highest Response Ratio Next Scheduling. It is an optimal scheduling algorithm. HRRN是最高响应率下一个调度的缩写 。 这是…

利用堆栈做循环

程序&#xff1a; #include "stdio.h" int main(int argc,char *argv[]) {char *str"%d";printf("hello world");__asm{ log:lea eax,logpush eaxlea ebx,strpush ebxpush eaxcall printfret 8}return 0;}运行&#xff1a;一直死循环运行下去 …

c# 多线程异步demo

一个 c# winform 多线程异步demo&#xff0c;分享下。 因为例子都很简单&#xff0c;所以不多说明&#xff0c;自己下载吧。转载于:https://www.cnblogs.com/chaobao/archive/2011/08/18/CSharpSync.html

(转)项目管理知识体系术语 123

项目管理知识体系术语(一)本词汇集包括和不包括的术语这个词汇集包括的词汇是&#xff1a;对于项目管理是唯一的&#xff0c;或接近于唯一的词汇(例如&#xff1a;范围说明&#xff0c;工作单元&#xff0c;工作分解结构&#xff0c;关键线路法)。对于项目管理是不是唯一的&…

矩形的个数

描述 在一个3*2的矩形中&#xff0c;可以找到6个1*1的矩形&#xff0c;4个2*1的矩形3个1*2的矩形&#xff0c;2个2*2的矩形&#xff0c;2个3*1的矩形和1个3*2的矩形&#xff0c;总共18个矩形。 给出A&#xff0c;B,计算可以从中找到多少个矩形。 输入 本题有多组输入数据&a…

计算机编程要哪方面天赋,编程要哪门子天赋

开局一张图写代码真的需要天赋吗&#xff1f;有句话是这样说的&#xff1a;论大家的努力程度&#xff0c;远不到拼天赋的时候。我认为所谓的天赋&#xff0c;应该是行业内Top10%水平才需要天赋&#xff0c;比如Linux缔造者Linus Torvalds&#xff0c;苹果发明者斯蒂夫沃兹尼亚克…

VBA之EXCEL删除和设置单元格行高等

‘删除Sheet1上的单元格区域A1:D10,并将其余单元格左移以填补被删除单元格的位置 Sheet1.Range(“A1:D10”).Delete Shift:xlShiftToLeft ‘删除指定行 Range(“1:1”).Delete ‘删除指定列 Columns(5).Delete ‘删除当前行 ActiveCell.EntireRow.Delete ‘删除工作表中的重复行…

java void方法_Java对象类的最终void wait(long ms)方法,包含示例

java void方法对象类最终无效等待(长毫秒) (Object Class final void wait(long ms)) This method is available in java.lang.Object.wait(long ms). 此方法在java.lang.Object.wait(long ms)中可用。 This method causes the current thread to wait for a specified amount …

C和汇编----字符串

字符串是以空字符&#xff08;\0&#xff09;结尾的char类型数组。 0x01 定义字符串和初始化 用双引号括起来的内容称为字符串字面量&#xff0c;也叫字符串常量&#xff0c;双引号中的字符串和编译器自动加入\0字符&#xff0c;都作为字符串存储在内存中 #include "st…

出现此版本的sql server不支持用户实例登陆标志 问题的解决方法

场景: 开发工具vs2005 数据库 sql 2005加入了Enterprise Libraty后,新增了一个data access application block,在写ConnectString的时候,出现这个错误提示,解决办法:在连接属性的设置里边,点高级,将User Instance 设置为false,默认的true,所以才导致这个问题的出现.设置好后,重…

计算机编程输入与输出,计算机编程语言的发展与输入输出设备的使用

计算机编程语言的发展与输入输出设备的使用辽宁大学学报自然科学版第32卷 第2期 2005年JOURNALOFLIAONINGUNIVERSITYNaturalSciencesEditionVol.32 No.2 2005计算机编程语言的发展与输入输出设备的使用宋明杰3(辽宁大学信息科学与技术学院,辽宁沈阳110036)摘 要:在编程中涉…

大小写互换

描述 现在给出了一个只包含大小写字母的字符串&#xff0c;不含空格和换行&#xff0c;要求把其中的大写换成小写&#xff0c;小写换成大写&#xff0c;然后输出互换后的字符串。 输入 第一行只有一个整数m&#xff08;m<10),表示测试数据组数。 接下来的m行&#xff0c…

远控免杀专题1---基础篇

0x01 免杀概念 免杀&#xff0c;也就是反病毒与反间谍的对立面&#xff0c;英文为Anti-AntiVirus&#xff08;简写 Virus AV&#xff09;&#xff0c;逐字翻译就是反-反病毒&#xff0c;翻译为反病毒技术。 0x02 杀毒软件检测方法 1、扫描结束 扫描压缩包技术&#xff1a;即…