写一个简单的工作流(二)

简介:
  hoho,今天完成了选择路由的实现,完成了配置文件的读写和解析,流程定义文件还是决定采用xml文件,不过与其他工作流引擎采用的xml完全不同,因为是基于petri网的,因此引入了place的概念,比如下面这个4个节点的顺序路由的流程:
< workflow  maxCases ="100" >
    
< node  type ="start"  name ="start"  id ="0" >
        
< inputs >
            
< place  id ="1"   />
        
</ inputs >
        
< outputs >
            
< place  id ="2"   />
        
</ outputs >
    
</ node >
    
< node  name ="hello"  id ="1"  resource ="user" >
        
< conditions  type ="and" >
            
< condition
                
class ="net.rubyeye.insect.workflow.impl.NullHandler"  value ="false"
                variable-name
="name"   />
        
</ conditions >
        
< handler
            
class ="net.rubyeye.insect.workflow.test.HelloWorldHandler"   />
        
< inputs >
            
< place  id ="2"   />
        
</ inputs >
        
< outputs >
            
< place  id ="3"   />
        
</ outputs >
    
</ node >
    
< node  name ="calc"  id ="2"  resource ="user" >
        
< conditions  type ="and" >
            
< condition  variable-name ="num" >
                
< exp >
                    
<![CDATA[ num<=1000 ]]>
                
</ exp >
            
</ condition >
            
< conditions  type ="or" >
                
< condition  variable-name ="num" >
                    
< exp >
                        
<![CDATA[ num>=10 ]]>
                    
</ exp >
                
</ condition >
                
< condition
                    
class ="net.rubyeye.insect.workflow.impl.NullHandler"  value ="false"
                    variable-name
="name"   />
            
</ conditions >
        
</ conditions >
        
< handler
            
class ="net.rubyeye.insect.workflow.test.CalculateHandler"   />
        
< inputs >
            
< place  id ="3"   />
        
</ inputs >
        
< outputs >
            
< place  id ="4"   />
        
</ outputs >
    
</ node >
    
< node  type ="end"  name ="hello"  id ="3" >
        
< inputs >
            
< place  id ="4"   />
        
</ inputs >
        
< outputs >
            
< place  id ="5"   />
        
</ outputs >
    
</ node >
</ workflow >
   
并行路由和选择路由引入了and-split,and-join,or-split,or-join四种transition,比如and-split,它就有多个输出place:

< node  name ="split"  type ="and-split"  id ="1"  resource ="user" >
        
< inputs >
            
< place  id ="2"   />
        
</ inputs >
        
< outputs >
            
< place  id ="3"   />
            
< place  id ="4"   />
        
</ outputs >
    
</ node >

   Place和Transition都有条件,用于决定操作是否执行,Transition额外指定了驱动的资源以及回调的handler,这一点非常重要,资源可能是用户、用户组、某个时间点定时事件、特定消息等等。
   今天额外发现的一个好处就是,引入Place之后,我可以轻易地将不同的流程连接起来组织成一个更复杂的流程,仅仅是需要修改各个流程的开始和结束的节点的输入输出库所,从而实现了层次化的Petri网,,类似代码:
WorkFlow sequence  =  wm.getWorkFlow( " sequence " );
        WorkFlow concurrency 
=  wm.getWorkFlow( " concurrency " );
        WorkFlow choose 
=  wm.getWorkFlow( " choose " );

        
// 组合流程
        composite  =   new  WorkFlow();
        composite.setName(
" composite " );
        composite.setId(
100 );
        
        wm.saveWorkFlow(composite);

        
// 修改开始结束节点的输入输出库所
        sequence.getEnd().setType(TransitionType.NORMAL);
        sequence.getEnd().setOutputs(concurrency.getStart().getInputs());

        concurrency.getEnd().setType(TransitionType.NORMAL);
        concurrency.getEnd().setOutputs(choose.getStart().getInputs());
        
        composite.setStart(sequence.getStart());
        composite.setEnd(choose.getEnd());
        List
< Transition >  transitions  =   new  ArrayList < Transition > ();
        transitions.addAll(sequence.getTransitions());
        transitions.addAll(concurrency.getTransitions());
        transitions.addAll(choose.getTransitions());
        composite.setTransitions(transitions);
文章转自庄周梦蝶  ,原文发布时间2007-10-11
目录
相关文章
|
17天前
工作流介绍
工作流介绍
|
10月前
工作流
工作流
126 0
|
11月前
snakerflow工作流实践分享
snakerflow工作流实践分享
196 0
|
Serverless
函数工作流
函数工作流自制脑图
88 0
函数工作流
powerjob配置工作流
powerjob工作流内配置依赖关系及判断节点
785 0
powerjob配置工作流
|
存储 弹性计算 监控
浅析数据工作流Prefect
简述 Prefect 是一种新的工作流管理系统,专为现代基础设施而设计,由开源的 Prefect Core 工作流引擎提供支持。 用户只需将任务组织成流程,Prefect 负责其余的工作,可让您非常容易使用数据工作流并添加重试、日志记录、动态映射、缓存、失败通知等语义。
|
开发工具 git
GitFlow工作流
GitFlow工作流
|
运维 Shell 调度