`

写一个简单的工作流(四)资源的处理

    博客分类:
  • java
阅读更多
    昨天晚上搞到深夜,终于将资源模块搞定。到今天已经完成的功能包括:
1.四种基本路由:顺序、选择、并行、循环
2.流程定义文件和系统配置文件的读取和解析
3.使用内存作为流程数据和案例数据存储的MemoryWorkFlowDAO的开发
4.资源模块的开发
5.并发情况下的正确性测试等

    计划中的功能:
1.一个GUI的流程定义工具,这个不急,也还没想好用什么做,web还是桌面?
2.各个数据库版本的WorkFlowDAO的开发,将流程数据和案例数据保存在数据库中。
3.更多的测试和example试验。

    回到资源这个概念,工作流中工作项(work item)的由资源来驱动的,这个资源(resource)可能是用户、角色、定时时间或者某个事件消息。在标准petri网中,工作项对应于 transition(变迁),变迁都是自动的,不需要所谓资源来驱动,显然,这与工作流系统不同。具体到insect workflow(我取的名字,小巧之意),每个transition都有一个resource,用于驱动自身的firing,所有的resource都 实现Resource接口:
java 代码
 
  1. public interface Resource extends Serializable {  
  2.   
  3.     public void start(Transition transition, Token token, Object args);  
  4.              
  5.     public ResourceType getType();  
  6.   
  7.     public long getId();  
  8.   
  9. }  

    每个资源都有一个类型,以及这个类型中独一无二的id,start方法用于驱动transtion的firing。一般情况下,你不需要实现这个接口,只 要继承这个接口的抽象实现类AbstractResource,AbstractResource的start方法默认实现是首先调用模板方法 doAction(稍后解释),然后检查触发条件,如果通过就直接调用transition的fire方法:
java 代码
 
  1. public abstract class AbstractResource implements Resource {  
  2.            
  3.     public void start(Transition transition, Token token, Object args) {  
  4.         doAction(transition, token, args);  
  5.   
  6.         if (transition.getCondition() != null  
  7.                 && !transition.getCondition().check(token))  
  8.             throw new ConditionException(transition.getName()  
  9.                     + " transition没有满足触发条件");  
  10.         transition.fire(token, args);  
  11.     }  
  12.     public abstract void doAction(Transition transition, Token token,  
  13.             Object args) ;  
  14.          
  15. }  

    Transtion类的fire方法有三个操作组成:从输入库所移走token,往输出库所放入token,回调handler:
java 代码
 
  1. public void fire(Token token, Object args) {  
  2.       removeTokenFromInputs(token);  
  3.       addTokenToOutputs(token);  
  4.       invokeHandler(token, args);  
  5.   }  


       那么具体的资源显然要实现AbstractResource中的doAction抽象方法,系统内置了五种资源:自动资源(AutoResource)、 用户(User)、用户组(Group)、定时器(TimerResource)和事件监听器(ObserverResource)。显然, AutoResource、User和Group的doAction方法不需要做任何事情:
java 代码
 
  1. public class User extends AbstractResource {  
  2.     protected Group group;  
  3.               
  4.     @Override  
  5.     public void doAction(Transition transition, Token token, Object arg){  
  6.     }  
  7.   
  8. }  
   
    而TimerResource就需要做特殊处理了,比如我们要达到这样的效果:节点1状态已经处于就绪,可以被触发,可我们希望在就绪后延迟半分钟再触 发,或者在晚上10点触发等等。这样的定时需求很常见,我采用了jdk5引入的ScheduledExecutorService来处理。系统中启动这样 一个线程池,每个类似上面的请求都提交给这个线程池来处理,那么TimerResource就需要进行相应的修改:
java 代码
 
  1. public abstract class TimerResource extends AbstractResource {  
  2.   
  3.     protected int pool_size;  
  4.   
  5.     protected static ScheduledExecutorService scheduledExecutorService;  
  6.   
  7.     @Override  
  8.     public long getId() {  
  9.         // TODO Auto-generated method stub  
  10.         return Common.TIMER_RESOURCE_ID;  
  11.     }  
  12.   
  13.     public TimerResource() {  
  14.         this.pool_size = 5;  
  15.         scheduledExecutorService = Executors.newScheduledThreadPool(pool_size);  
  16.     }  
  17.   
  18.     public static void shutdownPool() {  
  19.         if (scheduledExecutorService != null)  
  20.             scheduledExecutorService.shutdown();  
  21.     }  
  22.   
  23.     public final void start(Transition transition, Token token, Object args)  
  24.             throws InterruptedException {  
  25.         if (transition.getCondition() != null  
  26.                 && !transition.getCondition().check(token))  
  27.             throw new ConditionException(transition.getName()  
  28.                     + " transition没有满足触发条件");  
  29.         transition.removeTokenFromInputs(token);  
  30.         doAction(transition, token, args);  
  31.     }  
  32.   
  33.     protected class ChangeRunner implements Runnable {  
  34.         private Transition transition;  
  35.   
  36.         private Token token;  
  37.   
  38.         private Object[] args;  
  39.   
  40.         public ChangeRunner(Transition transition, Token token, Object args) {  
  41.             this.transition = transition;  
  42.             this.token = token;  
  43.             this.args = args;  
  44.         }  
  45.   
  46.         public void run() {  
  47.             if (transition.getCondition() != null  
  48.                     && !transition.getCondition().check(token))  
  49.                 throw new ConditionException(transition.getName()  
  50.                         + " transition没有满足触发条件");  
  51.             transition.addTokenToOutputs(token);  
  52.             Object real_args[] = new Object[args.length - 2];  
  53.             for (int i = 0; i < real_args.length; i++)  
  54.                 real_args[i] = args[i + 2];  
  55.             transition.invokeHandler(token, real_args);  
  56.             try {  
  57.                 // 回调  
  58.                 ((WorkFlowAlgorithm) args[1]).enabledTraversing(token  
  59.                         .getWorkFlow());  
  60.                 ((WorkFlowManager) args[0]).doAction(token.getId());  
  61.   
  62.             } catch (InterruptedException e) {  
  63.                 Thread.currentThread().interrupt();  
  64.             }  
  65.         }  
  66.     }  
  67. }  

    注意到,start方法不再是直接调用transition的fire方法,而仅仅是进行了第一步操作:移除输入库所的place防止重复提交。后两步操作都延迟到了提交给线程池的任务中,也就是代码中的ChangeRunner类中的run方法。例如TimerResource的子类DelayTimerResource用于处理延迟的触发,doAction就像这样:
java 代码
 
  1. public class DelayTimerResource extends TimerResource {  
  2.       
  3.     @Override  
  4.     public void doAction(Transition transition, Token token, Object args){  
  5.         scheduledExecutorService.schedule(new ChangeRunner(transition, token,  
  6.                 args), this.delay, this.timeUnit);  
  7.   
  8.     }  
  9. }  

    延迟的时间,时间单位这些信息都可以在流程定义文件中设置。事件监听器资源与此类似,ObserverResource实现了 java.util.Observer接口,往输出库所放入token和回调handler两步操作被放在了update方法中提供给Subject回 调。
   

分享到:
评论

相关推荐

    工作流系统异常处理实现方法

    结构化异常处理方法中的异常传播和处理机制为工作流系统的异常处理提供了一个很好的借鉴模式。这种TRY-CATCH-FINALLY模式的异常处理过程如下: - 在TRY模块中检测程序运行情况,如果发生错误,则抛出异常; - 程序...

    最简约的java工作流源代码

    5. **用户界面**:为了与用户交互,工作流系统通常会有一个简单的管理界面,用于启动流程、分配任务、查看流程状态等。这部分可能包含Servlet或JSP页面,以及相关的后台控制逻辑。 6. **配置和扩展**:为了适应不同...

    WinFrom的Workflow工作流的Hello World简单实例

    本实例主要介绍如何在WinForms中创建一个简单的Workflow工作流,即“Hello World”示例。 首先,我们需要创建一个WinForms项目。在Visual Studio中,选择“新建项目”,然后在模板中找到“Windows Forms应用程序”...

    JavaScript写的工作流设计器

    1. **图形化界面**:用户可以通过拖拽节点和连接线来构建工作流程,每个节点代表一个任务或决策,连接线则表示任务间的流转关系。 2. **自定义工作流**:用户可以根据需求自定义不同类型的节点和工作流逻辑,例如...

    工作流系统时间异常处理研究

    该时间异常处理方法在一个实际的产品创新设计领域的工作流系统中进行了实现与验证。通过模拟不同的异常场景,验证了该方法的有效性和可行性。实验结果显示,该方法能够有效地预测并处理时间异常,显著降低了异常对...

    Java工作流源码

    2. jBPM:jBPM 是一个全面的业务流程管理系统,不仅包含工作流引擎,还包括规则引擎、事件处理和决策支持,支持BPMN 2.0标准。 3. Camunda:Camunda 是一个轻量级的BPM平台,提供工作流引擎、模型er和监控工具,支持...

    工作流管理基础,很完善的工作流资源

    工作流管理基础是IT领域中一个重要的概念,它涉及到企业业务流程自动化、协同工作和信息系统的集成。在本文中,我们将深入探讨工作流的核心概念、关键技术和应用。 工作流(Workflow)可以理解为企业或组织中任务、...

    工作流实例 工作流实例

    例如,一个简单的请假申请流程可以视为一个工作流实例,其中包括员工提交申请、经理审批、人力资源部门记录等步骤。每个步骤都可能涉及不同的参与者,并且可能有特定的条件和规则,如审批权限、假期天数限制等。 在...

    工作流资料+DEMO源代码

    在给定的资源中,“工作流资料+DEMO源代码”包含了一个名为“NetronLight工作流软件源码.rar”的压缩包,以及一份“工作流资料”,这为我们提供了一个研究和学习工作流管理系统实现的宝贵机会。 首先,我们来详细...

    工作流学习笔记-工作流语言

    工作流管理系统是一个软件应用,它负责存储流程定义,并通过工作流引擎来执行这些定义。工作流引擎是系统中的执行模块,负责在运行时按照定义的规则推进流程。流程定义工具是创建和修改流程定义的软件,它可以帮助...

    C#,一个学习工作流的好例子

    在IT领域,工作流是一种自动化业务过程的工具,它能够按照预定义的规则和步骤来协调计算机系统之间的任务。...总之,"C#,一个学习工作流的好例子"是一个宝贵的教育资源,有助于提升开发者在工作流开发领域的技能。

    工作流解析工作流解析

    本文主要探讨了如何利用Spring框架实现简单工作流,将Spring作为一个轻量级的工作流引擎。工作流在许多J2EE应用程序中扮演着重要角色,尤其在处理后台任务和流程控制时。Spring容器通过控制反转(IoC)和依赖注入...

    工作流和DevExpress

    在“RDProject-master”这个压缩包文件中,可能包含了使用DevExpress开发的一个具体工作流项目,包括源代码、设计文件、配置文件等资源。通过深入研究这个项目,开发者不仅可以了解DevExpress工作流组件的使用方法,...

    SSH简单工作流系统

    在这个“SSH简单工作流系统”中,开发者可能已经创建了一个人力资源管理(HRSystem)的示例应用。工作流系统通常涉及到任务审批、流程定义、状态转移等元素,这些可以通过Struts2的Action和Spring的Service层来实现...

    WorkFlow C++ 工作流图形

    "WorkFlow C++ 工作流图形"是一个专注于在C++环境中实现工作流管理的图形化库。工作流,简单来说,就是一系列按照特定顺序执行的任务或活动,它在企业管理、软件开发、流程自动化等领域中广泛应用。C++作为一门强大...

    遥感数据处理运行控制中的工作流应用.pdf

    在当前的遥感技术领域,针对地面遥感数据处理系统运行控制的研究,尤其是如何高效处理大规模遥感数据,已成为一个重要的研究课题。随着空间分辨率、时间分辨率、光谱分辨率和辐射分辨率的不断提高,数据处理量也在...

    十分详细的工作流实例

    总的来说,这个资源集合为学习和实施C#工作流提供了一个全面的平台,涵盖了从理论到实践的各个层面。无论是对工作流原理的深入理解,还是在实际项目中的应用,都将受益匪浅。通过研究源码、阅读论文和笔记,你将能够...

    工作流技术及应用

    工作流技术及应用是软件工程领域的一个重要组成部分,它涉及到企业流程管理、自动化以及协作的方方面面。工作流技术主要用于设计、执行和管理按照一定规则进行的一系列任务或业务过程,以提升效率,优化业务流程,并...

    php 工作流源码

    总之,这个“php 工作流源码”是一个全面的学习资源,涵盖了从后端逻辑到前端交互的完整工作流系统实现。对于想要深入理解工作流管理和PHP开发的开发者来说,这是一个宝贵的实践案例。通过研究这个源码,你可以学习...

Global site tag (gtag.js) - Google Analytics