发明名称 一种用于工作流引擎的多任务协同调度方法
摘要 本发明公开了一种用于工作流引擎的多任务协同调度方法,构建多任务协同方法的计算模型——多步任务协同网,这是一个四元组N=(C,T;W,D)按照充分必要条件构造,多任务调度包括启动案例、终止案例、客户机签办任务、客户机退回任务、多步任务办理、多步任务重办、启动循环和终止循环八个调度方法。在多任务调度之前,案例和所有的工作、任务、转发、循环都被初始化为就绪状态。启动案例是第一个被执行调度,客户机签办任务、客户机退回任务、多步任务办理、多步任务重办、启动循环和终止循环是根据多步任务协同网的流向,包括正向和逆向,终止案例调度是根据工作和转发的状态由系统自动调度。本发明实现多步任务的正向和逆向调度。
申请公布号 CN1728165A 申请公布日期 2006.02.01
申请号 CN200510042888.6 申请日期 2005.07.04
申请人 西安交通大学;西安龙舟科技有限责任公司 发明人 胡飞虎
分类号 G06Q10/00(2006.01);G06F9/46(2006.01) 主分类号 G06Q10/00(2006.01)
代理机构 西安通大专利代理有限责任公司 代理人 陈翠兰
主权项 1、一种用于工作流引擎的多任务协同调度方法,其特征在于:按照如下步骤进行:(i)构建多任务协同方法的计算模型——多步任务协同网,这是一个四元组N=(C,T;W,D)按照如下充分必要条件构造的:1°C≠φ2°T≠φ3°CI T=φ4°WC×T5°DT×C6°dom(W)Y cod(W)=CYT其中,<math> <mrow> <mi>dom</mi> <mrow> <mo>(</mo> <mi>W</mi> <mo>)</mo> </mrow> <mo>=</mo> <mo>{</mo> <mi>x</mi> <mo>|</mo> <mo>&Exists;</mo> <mi>y</mi> <mo>:</mo> <mrow> <mo>(</mo> <mi>x</mi> <mo>,</mo> <mi>y</mi> <mo>)</mo> </mrow> <mo>&Element;</mo> <mi>W</mi> <mo>}</mo> <mo>,</mo> </mrow> </math> <math> <mrow> <mi>cod</mi> <mrow> <mo>(</mo> <mi>W</mi> <mo>)</mo> </mrow> <mo>=</mo> <mo>{</mo> <mi>y</mi> <mo>|</mo> <mo>&Exists;</mo> <mi>x</mi> <mo>:</mo> <mrow> <mo>(</mo> <mi>x</mi> <mo>,</mo> <mi>y</mi> <mo>)</mo> </mrow> <mo>&Element;</mo> <mi>W</mi> <mo>}</mo> <mo>;</mo> </mrow> </math> 在四元组中,C是一个有限的客户机集合;T是一个有限的任务集合;W是工作的集合,表示客户机在任务中的分工;D是转发的集合,表示任务的流转方向;(2)构建多步任务协同网的动态结构——多步任务协同网系统,这是一个八元组∑=(C,T;W,D;W0,PD,G,L)按照如下条件构造的:1°N=(C,T;W,D)是一个多步任务协同网;2°W0W,是起始工作的集合,起始工作是指不依赖于任何任务客户机就可以办理的工作;3°PD是定义在D上的转发条件的集合,转发条件指转发依赖的条件;4°G是定义在C上的分组的集合,如果客户机即将办理的工作和已完成任务之间存在依赖关系,则需要将这些工作和传递这些任务的转发划分成一组,称为分组;5°LW∪D,是循环的集合,循环指可被反复执行的,并只保留最后一次执行信息的环形路径;(3)构建多任务调度所需的状态集合,包括五个状态集合:1°案例的状态集合:Si={Sir,Siw,Swf},案例是多步任务协同网的一次执行,一个多步任务协同网可以被多次执行,每次执行都对应一个不同的案例,其中,Sir就绪状态:案例等待执行的状态,Siw在办状态:案例正在执行的状态,Sif完成状态:案例已经结束的状态;2°工作的状态集合:Sw={Swr,Sww,Swn,Swf},其中,Swr就绪状态:工作等待客户机办理的状态,Sww在办状态:工作正在被客户机办理的状态,Swn否定状态:工作因条件不满足不能被客户机办理的状态,Swf完成状态:工作已经结束的状态;3°任务的状态集合:St={Str,Stw,Stn,Stf},其中,Str就绪状态:任务等待客户机办理的状态,Stw在办状态:任务正在被客户机办理的状态,Stn否定状态:任务因条件不满足不能被客户机办理的状态,Stf完成状态:任务已经结束的状态;4°转发的状态集合:Sd={Sdr,Sdw,Sdn,Sdf},其中,Sdr就绪状态:转发等待被执行的状态,Sdw待签状态:转发等待被客户机签收的状态,Sdn否定状态:转发因条件不满足不能被客户机签收的状态,Sdf完成状态:转发已经结束的状态;5°循环的状态集合:S1={Slr,Slw,Sdf};其中,Slr就绪状态:循环等待被执行的状态,Slw工作状态:循环正在被执行的状态,Slf完成状态:循环已经结束的状态;(4)多任务调度包括启动案例、终止案例、客户机签办任务、客户机退回任务、多步任务办理、多步任务重办、启动循环和终止循环八个调度方法;在多任务调度之前,案例和所有的工作、任务、转发、循环都被初始化为就绪状态;启动案例是第一个被执行调度,客户机签办任务、客户机退回任务、多步任务办理、多步任务重办、启动循环和终止循环是根据多步任务协同网的流向,包括正向和逆向,由客户机进行调度的,终止案例的调度是根据工作和转发的状态由系统自动调度的;令:SetStatus(x)表示设置对象x的状态,x为案例、任务、工作、转发或循环;GetStatus(x)表示获得对象x的状态,x为案例、任务、工作、转发或循环;SetClient(x)表示设置对象所属客户机,x为工作或转发;GetClient(x)表示获得对象所属客户机,x为工作或转发;PreCondition(x)表示条件计算,结果为True或False,x为转发;Count(x)表示集合中对象的数目,x为一个集合;则多步任务的调度方法可表述如下:1°启动案例:设w0为案例i的任一起始工作,W0是w0的集合,则启动案例的调度方法如下:将案例和每一个起始工作的状态设置为在办状态,即SetStatus(i):=Siw SetStatus(w0):=Sww,w0∈W0 2°终止案例:设w为案例i的任一工作,W是w的集合,d为案例i的任一转发,D是d的集合,则终止案例的调度方法为:第一步:若案例中仍有待办的工作或待签收的任务,即GetStatus(w)=Sww,<math> <mrow> <mo>&Exists;</mo> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> </mrow> </math> 或GetStatus(d)=Sdw,<math> <mrow> <mo>&Exists;</mo> <mi>d</mi> <mo>&Element;</mo> <mi>D</mi> <mo>,</mo> </mrow> </math> 则不能终止案例,结束;否则转第二步;第二步:将案例的状态置为完称状态,即SetStatus(i):=Sif;3°客户机签办任务:设c是案例i中的任一客户机,gc是定义在c上的任一分组,d是分组gc中的任一转发,D是d的集合,’t是d所属的任务,d是任务’t中的任一转发,D是d的集合,’w是任务’t中的任一工作,’W是’w的集合,w是分组gc中的任一工作,W是w的集合,t是w所属的任务,w是任务t中的任一工作,W是w的集合,d’是任务t中的任一转发,D’是d’的集合,则客户机c签办任务的调度方法如下:第一步:若gc中的每一个转发d都处于待签或否定状态,即GetStatus(d)∈{Sdw,Sdn},d∈D,则转第二步;否则结束;第二步:若gc中的每一个转发d都处于否定状态,即GetStatus(d)=Sdn,d∈D,则转第三步;否则转第四步;第三步:将gc中的每一个工作w设置为否定状态,即SetStatus(w):=Swn,w∈W;对于每一个w,若其所属任务t的每一个工作w都处于否定状态,即GetStatus(w)=Swn,w∈W,则将任务t和任务t的每一个转发d′设置为否定状态,即SetStatus(t):=Stn SetStatus(d′):=Sdn,d′∈D′,结束;否则结束;第四步:对于gc中的任一个d,若其处于待签状态,则将d的客户机设置为c,即SetCliet(d):=c,则转第六步;否则将d的客户机设置为空值null,即SetClient(d):=null,并转第五步;第五步:若d所属任务’t处于否定状态,即GetStatus(′t):=Stn,则将任务’t和其每一个工作’w及每一个转发d设置为完成状态,即SetStatus(′t):=Stf,SetStatus(′w):=Swf,′w∈′W,SetStatus(d):=Sdf,d∈D;第六步:将gc中的每一个转发d设置为完成状态,每一个工作w设置为完成状态,并将每一个工作w的客户机设置为c,即SetStatus(d):=Sdf,d∈D,SetClient(w):=c,w∈W,SetStatus(w):=Sww,w∈W;若gc中仍有转发d处于待签或否定状态,即GetStatus(d)∈{Sdw,Sdn},d∈D,则转第四步;否则转第七步;第七步:若任务t处于就绪状态,即GetStatus(t)=Str,则将任务t设置为在办状态,即SetStatus(t):=Stw;第八步:客户机c办理gc中的任一个工作w;第九步:若工作w办理完毕,则将工作w设置为完成状态,即SetStatus(w):=Swf;若gc中仍有处于在办状态的工作,即GetStatus(w)=Sww,<math> <mrow> <mo>&Exists;</mo> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>,</mo> </mrow> </math> 则转第八步;否则结束;4°客户机退回任务:设c是案例i中的任一客户机,gc是定义在c上的任一分组,d是分组gc中的任一转发,D是d的集合,’t是d所属的任务,d是任务’t中的任一转发,D是d的集合,’w是任务’t中的任一工作,’W是’w的集合,w是分组gc中的任一工作,W是w的集合,t是w所属的任务,w是任务t中的任一工作,W是w的集合,d是任务t中的任一转发,D’是d’的集合,则客户机c退回任务的调度方法如下:第一步:若gc中的每一个工作w都处于在办状态,即GetStatus(w)=Sww,w∈W,则转第二步;否则结束;第二步:将gc中的每一个工作w都设置为就绪状态,即SetStatus(w):=Swr,w∈W;对于gc中的每一个工作w,若w所属任务t的每一个工作w都处于就绪状态,即GetStatus(w)=Swr,w∈W,则将任务t设置为就绪状态,即SetStatus(t):=Str;第三步:对于gc中的任一个d,若其客户机为c,即GetClient(d)=c,则将d的客户机设置为null,并将d设置为待签状态,即SetClient(d):=null,SetStatus(d):=Sdw,之后转第五步;否则将d设置为否定状态,即SetStatus(d):=Sdn,之后转第四步;第四步:若d所属任务′t的每一个转发d都处于否定状态,即GetStatus(d)=Sdn,d∈D,并且任务′t的每一个工作′w的客户机都为空值null,即GetClient(′w)=null,′w∈′W,则将任务′t设置为否定状态,即SetStatus(′t):=Stn;结束;5°多步任务办理:设t是案例中的任一任务,w是任务t的任一工作,W是w的集合,c是负责办理工作w的客户机,gc是定义在客户机c上的任一分组,’d是分组gc中的任一转发,’D是’d的集合,’t是’d所属的工作,’w是任务’t的任一工作,’W是’w的集合,’d是’t的任一转发,’D 是’d的集合,w是分组gc中的任一工作,W是w的集合,d是任务t的任一转发,D是d的集合,c’是d所属的客户机,gc’是定义在客户机c’上的任一分组,d是分组gc’中的任一转发,D是d的集合,w’是分组gc’中的任一工作,W’是w’的集合,t’是w’所属的任务,w’是任务t’中的任一工作,W’是w’的集合,d’是t’的任一转发,D’是d’的集合,则任务t办理过程的调度方法如下:第一步:若任务t的每一个工作w都处于完成或否定状态,即GetStatus(w)∈{Swf,Swn},<math> <mrow> <munder> <mo>&ForAll;</mo> <mo>&CenterDot;</mo> </munder> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>,</mo> </mrow> </math> 则转第二步;否则结束;第二步:若任务t的每一个工作w都处于否定状态,即GetStatus(w)=Swn,<math> <mrow> <munder> <mo>&ForAll;</mo> <mo>&CenterDot;</mo> </munder> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>,</mo> </mrow> </math> 则将任务t和任务t的每一个转发d设置为否定状态,即SetStatus(t):=Stn SetStatus(d):=Sdn,d∈D,之后转第七步;否则转第三步;第三步:对于t中的任一个w,若w处于否定状态,则将w设置为完成状态,将w的客户机设置为空值null,将与w处于同一分组gc中的每一个工作w和每一个转发′d设置为完成状态,即SetStatus(w):=Swf,SetClient(w):=null,SetStatus(w)=Swf,w∈W,SetStatus(′d)=Sdf,′d∈′D,之后转第四步;否则转第五步;第四步:对于任一个′d,若′d所属任务′t处于否定状态,即GetStatus(′t)=Stn,则将任务′t和任务′t的每一个转发′d设置为完成状态,即SetStatus(′t):=Stf,SetStatus(′d):=Sdf,′d∈′D;第五步:若任务t有工作w处于否定状态,即GetStatus(w)=Swn,<math> <mrow> <mo>&Exists;</mo> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>,</mo> </mrow> </math> 则转第三步;否则转第六步;第六步:将任务t设置为完成状态,即SetStatus(t):=Stf,<math> <mrow> <mo>&Exists;</mo> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>;</mo> </mrow> </math> 计算任务t的每一个转发d的转发条件,若结果为真,即PreCondition(d)=True,则将转发d设置为待签状态,即SetStatus(d):=Sdw;否则将转发d设置为否定状态,即SetStatus(d):=Sdn;第七步:对于任一个d,若其所属分组gc’中的所有转发d处于否定状态,即GetStatus(d)=Sdn,d∈D,则将分组gc’中的所有工作w′设置为否定状态,即SetStatus(w′):=Swn,w′∈W′;第八步:对于任一个w′,若其所属任务t’中的所有工作w′处于否定状态,即GetStatusS(w′)=Swn,w′∈W′,则将任务t’和任务t’的所有转发d′设置为否定状态,即SetStatus(t′):=Stn SetStatus(d′)=Sdn,d′∈D′;结束;6°多步任务重办:设t是案例中的任一任务,w是任务t的任一工作,W是w的集合,c是负责办理工作w的客户机,gc是定义在客户机c上的任一分组,’d是分组gc中的任一转发,’D是’d的集合,’t是’d所属的工作,’w是任务’t的任一工作,’W是’w的集合,’d是’t的任一转发,’D 是’d的集合,w是分组gc中的任一工作,W是w的集合,d是任务t的任一转发,D是d的集合,c’是d所属的客户机,gc’是定义在客户机c’上的任一分组,d是分组gc’中的任一转发,D是d的集合,w’是分组gc’中的任一工作,W’是w’的集合,t’是w’所属的任务,w’是任务t’中的任一工作,W’是w’的集合,d’是t’的任一转发,D’是d’的集合,则客户机c重办任务t的调度方法如下:第一步:若任务t处于在办状态,即GetStatus(t)=Stw,或任务t处于完成状态且任务t没有转发,即GetStatus(t)=Stf & Count(D)=0,或任务t处于完成状态且任务t的每一个转发d都处于待签或否定状态,即GetStatus(t)=Stf & GetStatus(d)∈{Sdw,Sdn},d∈D,则转第二步;否则结束;第二步:对于任一个d,若其所属分组gc’中的每一个转发d都处于否定状态,即GetStatus(d)=Sdn,d∈D,则将分组gc’中的所有工作w′设置为就绪状态,即SetStatus(w′):=Swr,w′∈W′,之后转第三步;否则转第四步;第三步:对于任一个w′,若其所属任务t’处于否定状态,则将任务t’和任务t’的每一个转发d′设置为就绪状态,即SetStatus(t′)=Str SetStatus(d′)=Sdr,d′∈D′;第四步:将任务t和任务t要重办的工作w设置为在办状态,并将任务t的每一个转发d设置为就绪状态,即SetStatus(w):=Sww,SetStatus(t):=Stw,SetStatus(d):=Sdr,d∈D;对于任一个d,若其所属分组gc’中有工作w′处于否定状态,即GetStatus(w′)=Swn,<math> <mrow> <mo>&Exists;</mo> <msup> <mi>w</mi> <mo>&prime;</mo> </msup> <mo>&Element;</mo> <msup> <mi>W</mi> <mo>&prime;</mo> </msup> <mo>,</mo> </mrow> </math> 则将分组gc’中的每一个工作w′设置为就绪状态,即SetStatus(w′):=Swr,w′∈W′;第五步:若任务t有处于完成状态的工作w,且w的客户机为null,即GetStatus(w)=Swf & GetClient(w)=null,<math> <mrow> <mo>&Exists;</mo> <mi>w</mi> <mo>&Element;</mo> <mi>W</mi> <mo>,</mo> </mrow> </math> 则将w设置为否定状态,即SetStatus(w):=Swn;第六步:对于t中的任一个w,若w所属分组gc中的每一个工作w都处于否定状态,即GetStatus(w)=Swn,w∈W,则将gc中的每一个转发′d设置为否定状态,即SetStatus(′d):=Sdn,′d∈′D;第七步:对于任一个′d,若其所属任务′t处于完成状态,且任务′t的每一个工作′w的客户机都为空值null,即GetStatus(′t)=Stf & GetClient(′w)=null,′w∈′W,则将任务′t和任务′t的每一个工作′w都设置为否定状态,即SetStatus(′t):=Stn SetStatus(′w):=Swn,′w∈′W;第八步:客户机c重办工作w;第九步:若工作w办理完毕,则将工作w设置为完成状态,即SetStatus(w):=Swf,结束;否则转第八步;7°启动循环:设L为案例i的任一循环,w是循环路径上的任一工作,则启动循环的调度方法如下:若工作w属于循环L且工作w处于在办状态且循环L处于就绪状态,即w∈L &GetStatus(w)=Sww & GetStatus(L)=Slr,则将循环L设置为运行状态,即SetStatus(L):=Slw;否则结束;8°终止循环:设L为案例i的任一循环,w是循环路径上的任一工作,则终止循环的调度方法如下:若工作w属于循环L且工作w处于在办状态且循环L处于运行状态,即w∈L&GetStatus(w)=Sww& GetStatus(L)=Slw,则将循环L设置为运行状态,即SetStatus(L):=Slf;否则结束。
地址 710049陕西省西安市咸宁路28号