`

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

阅读更多
    hoho,今天完成了选择路由的实现,完成了配置文件的读写和解析,流程定义文件还是决定采用xml文件,不过与其他工作流引擎采用的xml完全不同,因为是基于petri网的,因此引入了place的概念,比如下面这个4个节点的顺序路由的流程:
xml 代码
 
  1. <workflow maxCases="100">  
  2.     <node type="start" name="start" id="0">  
  3.         <inputs>  
  4.             <place id="1" />  
  5.         </inputs>  
  6.         <outputs>  
  7.             <place id="2" />  
  8.         </outputs>  
  9.     </node>  
  10.     <node name="hello" id="1" resource="user">  
  11.         <conditions type="and">  
  12.             <condition  
  13.                 class="net.rubyeye.insect.workflow.impl.NullHandler" value="false"  
  14.                 variable-name="name" />  
  15.         </conditions>  
  16.         <handler  
  17.             class="net.rubyeye.insect.workflow.test.HelloWorldHandler" />  
  18.         <inputs>  
  19.             <place id="2" />  
  20.         </inputs>  
  21.         <outputs>  
  22.             <place id="3" />  
  23.         </outputs>  
  24.     </node>  
  25.     <node name="calc" id="2" resource="user">  
  26.         <conditions type="and">  
  27.             <condition variable-name="num">  
  28.                 <exp>  
  29.                     <![CDATA[num<=1000]]>  
  30.                 </exp>  
  31.             </condition>  
  32.             <conditions type="or">  
  33.                 <condition variable-name="num">  
  34.                     <exp>  
  35.                         <![CDATA[num>=10]]>  
  36.                     </exp>  
  37.                 </condition>  
  38.                 <condition  
  39.                     class="net.rubyeye.insect.workflow.impl.NullHandler" value="false"  
  40.                     variable-name="name" />  
  41.             </conditions>  
  42.         </conditions>  
  43.         <handler  
  44.             class="net.rubyeye.insect.workflow.test.CalculateHandler" />  
  45.         <inputs>  
  46.             <place id="3" />  
  47.         </inputs>  
  48.         <outputs>  
  49.             <place id="4" />  
  50.         </outputs>  
  51.     </node>  
  52.     <node type="end" name="hello" id="3">  
  53.         <inputs>  
  54.             <place id="4" />  
  55.         </inputs>  
  56.         <outputs>  
  57.             <place id="5" />  
  58.         </outputs>  
  59.     </node>  
  60. </workflow>  
  61.     
 
并行路由和选择路由引入了and-split,and-join,or-split,or-join四种transition,比如and-split,它就有多个输出place:
xml 代码
 
  1. <node name="split" type="and-split" id="1" resource="user">  
  2.         <inputs>  
  3.             <place id="2" />  
  4.         </inputs>  
  5.         <outputs>  
  6.             <place id="3" />  
  7.             <place id="4" />  
  8.         </outputs>  
  9.     </node>  

   Place和Transition都有条件,用于决定操作是否执行,Transition额外指定了驱动的资源,这一点非常重要,资源可能是用户、用户组、某个时间点定时事件、特定消息等等。初步有个想法写一个GUI的流程定义工具,不过我对GUI编程了解有限,先暂时推后了。
   今天额外发现的一个好处就是,引入Place之后,我可以轻易地将不同的流程连接起来组织成一个更复杂的流程,仅仅是需要修改各个流程的开始和结束的节点的输入输出库所,从而实现了层次化的Petri网,,类似代码:
java 代码
 
  1. WorkFlow sequence = wm.getWorkFlow("sequence");  
  2.         WorkFlow concurrency = wm.getWorkFlow("concurrency");  
  3.         WorkFlow choose = wm.getWorkFlow("choose");  
  4.   
  5.         //组合流程  
  6.         composite = new WorkFlow();  
  7.         composite.setName("composite");  
  8.         composite.setId(100);  
  9.           
  10.         wm.saveWorkFlow(composite);  
  11.   
  12.         //修改开始结束节点的输入输出库所  
  13.         sequence.getEnd().setType(TransitionType.NORMAL);  
  14.         sequence.getEnd().setOutputs(concurrency.getStart().getInputs());  
  15.   
  16.         concurrency.getEnd().setType(TransitionType.NORMAL);  
  17.         concurrency.getEnd().setOutputs(choose.getStart().getInputs());  
  18.           
  19.         composite.setStart(sequence.getStart());  
  20.         composite.setEnd(choose.getEnd());  
  21.         List<Transition> transitions = new ArrayList<Transition>();  
  22.         transitions.addAll(sequence.getTransitions());  
  23.         transitions.addAll(concurrency.getTransitions());  
  24.         transitions.addAll(choose.getTransitions());  
  25.         composite.setTransitions(transitions);  


分享到:
评论

相关推荐

    一个简单C#工作流的实现

    ### 一个简单C#工作流的实现 #### 一、背景介绍 在现代软件开发过程中,工作流的应用越来越广泛,特别是在需要多步骤处理且涉及多个角色的业务场景中。例如,高等学校岗位聘用审核系统就是一个典型的工作流应用...

    工作流]建立一个工作流程的简明过程

    本文将详细阐述如何从头开始,搭建一个基础的工作流框架,包括表单设计、流程规划以及工作启动三个核心环节。 #### 一、设计表单:业务需求的载体 表单设计是工作流构建的起点,其重要性在于它是业务数据的收集和...

    java 二进制文件的读写操作

    本文将详细介绍如何使用`FileInputStream`和`FileOutputStream`类来实现二进制文件的读写,并提供一个具体的示例代码进行解析。 #### 一、基础知识概述 1. **FileInputStream**:用于读取原始字节流的输入流。它是...

    一个用c#文件流写的通讯录

    在这个项目中,"一个用C#文件流写的通讯录"是一个实现个人联系人管理的简单应用,它利用文件流来读取、写入和存储联系人的信息。下面将详细讲解如何利用C#文件流进行操作,并探讨在创建通讯录应用程序时可能涉及的...

    用C#写的一个简单的计算器

    在本文中,我们将深入探讨如何使用C#编程语言创建一个简单的计算器应用。C#是一种面向对象的、现代的编程语言,常用于开发Windows桌面应用程序、Web应用以及游戏等。对于初学者来说,创建一个基本的计算器是学习C#的...

    C语言写的一个简单的画图程序

    在本项目中,"C语言写的一个简单的画图程序"是一个用C语言编写的轻量级图形绘制应用程序。这个程序展示了如何在不依赖高级图形库的情况下,利用C语言的基础功能来实现基本的图形操作。主要涉及到的技术点包括链表的...

    C# 读写二进制文件的一个示例

    下面是一个简单的二进制文件写入的示例: ```csharp using System; using System.IO; class Program { static void Main() { // 定义要写入的数据 byte[] data = new byte[] { 1, 2, 3, 4, 5 }; // 指定...

    IO流读写excel文档,并写入数据库

    总的来说,这个项目结合了Java的IO流操作、Apache POI处理Excel、Spring的依赖注入和事务管理以及Hibernate的ORM功能,实现了一个高效且健壮的Excel数据读写与数据库存储的解决方案。这样的技术栈在数据分析、报表...

    D Parser 之前:写一个简单的虚拟机

    标题中的“D Parser 之前:写一个简单的虚拟机”指的是在构建D语言解析器之前,先设计和实现一个简单的虚拟机。虚拟机是许多编程语言解释执行的基础,它模拟了真实的计算机硬件,允许编译后的代码在不同平台上运行。...

    C#实现文件读写,简单实现

    对于文件操作,`using`可确保流或其他资源在完成工作后被正确关闭。 6. **文本编码** 当处理非ASCII字符时,需要指定正确的文本编码,如UTF8或Unicode。在`StreamReader`和`StreamWriter`构造函数中可以指定。 7...

    一种C#读写二进制文件的通用方法-转

    这种数据结构相对较为抽象,从数据结构中看不到和 ID3V1 的各字段长度的对应关系,因此只能一个个字段的手动复制。 知识点五:C# 语言读取数据 在 C# 语言中,读取数据可以使用流操作来读取文件,并手动复制到数据...

    c#读写二进制数据到数据库

    首先,我们来看如何将一个文件作为二进制数据保存到数据库中。这里我们以SQL Server为例进行说明,但这些方法也适用于其他类型的数据库系统,只需稍作调整即可。 ##### 1. 准备工作 在开始之前,确保已经安装了...

    操作系统课程设计文件管理二级文件系统.doc

    设计一个简单的二级文件系统,有助于学生巩固课堂所学,并提升实践技能。在这个设计中,我们需要实现几个核心功能: 1. 用户登录(Login):设计一个登录系统,用户需输入正确的用户名和密码才能访问文件系统。在...

    JWFD1.01工作流系统(08升级版)

    JGRAPH中对图和顶点与边的定义与存储结构是非常简洁与实用的,利用数据库或者是GXL文件中的这些数据可以非常简单的处理一个复杂的流程图........... 该工具经过修改后,也可以实现一个实时监控界面和其它的适合于...

    AIGC + AI写作 + AI居家代写详细教程 + 第二职业

    这是一份AI代写的详细教程 + 适用于大学毕业生和白领等 + 可以作为居家的第二职业 + 本教程为作者本人原创录制/没有勾子/教程很详细/是作者操作了近三年的结晶 课程目录: 第01节 AI代写变现的介绍和简单实操 第02节...

    一个简单的串口操作工具

    《一个简单的串口操作工具——探索串口通信与音频切换模块》 串口通信,全称为串行通信,是计算机通信领域的一种基本技术,广泛应用于嵌入式系统、物联网设备以及各种工业自动化设备中。本篇文章将围绕一个名为...

    三步教你用Verilog写一个CPU:第三步

    在“三步教你用Verilog写一个CPU”的系列中,我们已经进入了第三步,这通常涉及到CPU核心的实现。在这里,我们将会讨论如何将之前的概念转化为实际的代码。 ### 第一步:理解CPU的基本结构 CPU是计算机的中央处理...

    QT一二进制形式读取图片

    通过这些知识点,我们可以编写一个简单的程序,读取一个图像文件,将其转换为二进制数据,然后将这些数据写入另一个文件。在实际应用中,这可能是为了备份图像,或者在不支持特定图像格式的环境中传输图像数据。 ...

    字节流字符流练习

    例如,当你需要从一个字节流读取文本数据时,可以先创建一个InputStreamReader,指定所需的字符集,然后用它来创建一个BufferedReader,这样就可以按字符读取文本了。 在实际开发中,我们通常会结合使用各种流类,...

Global site tag (gtag.js) - Google Analytics