`

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

阅读更多
    上午测试了下并发情况下的表现,测试场景:一个有20个节点,包括选择、顺序、并行路由的流程,所有节点都设置为自动执行,1000个线程并发启动案例, 也就是这个流程同时有1000个案例在跑,全部跑完结果差强人意,比单线程慢了接近30倍。仔细调整了算法和加锁粒度,尽管整体性能有所提高,但是多线程 和单线程间执行的差距仍然没有多大变化,性能瓶颈还是在核心的调度算法上,还需要分析下。测试程序如下:
java 代码
 
  1. package net.rubyeye.insect.workflow.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.CyclicBarrier;  
  6.   
  7. import net.rubyeye.insect.workflow.Place;  
  8. import net.rubyeye.insect.workflow.Token;  
  9. import net.rubyeye.insect.workflow.Transition;  
  10. import net.rubyeye.insect.workflow.WorkFlow;  
  11. import net.rubyeye.insect.workflow.WorkFlowManager;  
  12. import net.rubyeye.insect.workflow.basic.BasicWorkflowManager;  
  13. import net.rubyeye.insect.workflow.comm.TransitionType;  
  14. import net.rubyeye.insect.workflow.config.DefaultConfiguration;  
  15. import junit.framework.TestCase;  
  16.   
  17. public class CompositeProcessTest extends TestCase {  
  18.     private WorkFlowManager wm;  
  19.   
  20.     WorkFlow composite;  
  21.   
  22.     private CyclicBarrier barrier;  
  23.   
  24.     private static final int total = 1000;  
  25.   
  26.     @Override  
  27.     protected void setUp() throws Exception {  
  28.         this.barrier = new CyclicBarrier(total + 1);  
  29.         wm = new BasicWorkflowManager();  
  30.         wm.setConfiguration(new DefaultConfiguration());  
  31.   
  32.         WorkFlow sequence = wm.getWorkFlow("sequence");  
  33.         WorkFlow concurrency = wm.getWorkFlow("concurrency");  
  34.         WorkFlow choose = wm.getWorkFlow("choose");  
  35.   
  36.         // 组合流程  
  37.         composite = new WorkFlow();  
  38.         composite.setName("composite");  
  39.         composite.setId(100);  
  40.   
  41.         wm.saveWorkFlow(composite);  
  42.   
  43.         // 修改开始结束节点的输入输出库所  
  44.         sequence.getEnd().setType(TransitionType.NORMAL);  
  45.         sequence.getEnd().setOutputs(concurrency.getStart().getInputs());  
  46.   
  47.         concurrency.getEnd().setType(TransitionType.NORMAL);  
  48.         concurrency.getEnd().setOutputs(choose.getStart().getInputs());  
  49.   
  50.         composite.setStart(sequence.getStart());  
  51.         composite.setEnd(choose.getEnd());  
  52.         List<Transition> transitions = new ArrayList<Transition>();  
  53.         transitions.addAll(sequence.getTransitions());  
  54.         transitions.addAll(concurrency.getTransitions());  
  55.         transitions.addAll(choose.getTransitions());  
  56.         composite.setTransitions(transitions);  
  57.     }  
  58.   
  59.     public void testConcurrencyCompositeProcesss() throws Exception {  
  60.         for (int i = 0; i < total; i++) {  
  61.             new FlowThread().start();  
  62.         }  
  63.         barrier.await();  
  64.         long start = System.currentTimeMillis();  
  65.         barrier.await();  
  66.         long end = System.currentTimeMillis();  
  67.         System.out.println("创建" + total + "个流程并发运行完毕\n花费时间:" + (end - start)  
  68.                 / 1000.0 + "秒");  
  69.         for (Transition transition : composite.getTransitions()) {  
  70.             System.out.println(transition.getName() + "  "  
  71.                     + transition.isEnable());  
  72.             for (Place place : transition.getOutputs()) {  
  73.                 System.out.println("place " + place.getId() + " "  
  74.                         + place.getTokens().size());  
  75.             }  
  76.         }  
  77.     }  
  78.   
  79.     public void testCompositeProcesss() throws Exception {  
  80.         long start = System.currentTimeMillis();  
  81.         for (int i = 0; i < total; i++) {  
  82.             Token token1 = wm.startWorkFlow("composite");  
  83.             token1.setAttribute("name""dennis");  
  84.             token1.setAttribute("num"21);  
  85.             wm.doAction(token1.getId());  
  86.             assertTrue(token1.isFinished());  
  87.         }  
  88.         long end = System.currentTimeMillis();  
  89.         System.out.println("创建" + total + "个流程运行完毕\n花费时间:" + (end - start)  
  90.                 / 1000.0 + "秒");  
  91.     }  
  92.   
  93.     class FlowThread extends Thread {  
  94.   
  95.         @Override  
  96.         public void run() {  
  97.             try {  
  98.                 barrier.await();  
  99.                 // wm = new BasicWorkflowManager();  
  100.                 Token token1 = wm.startWorkFlow("composite");  
  101.                 token1.setAttribute("name""dennis");  
  102.                 token1.setAttribute("num"21);  
  103.                 wm.doAction(token1.getId());  
  104.                 assertTrue(token1.isFinished());  
  105.                 barrier.await();  
  106.             } catch (Exception e) {  
  107.                 throw new RuntimeException(e);  
  108.             }  
  109.         }  
  110.   
  111.     }  
  112. }  
分享到:
评论

相关推荐

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

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

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

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

    [工作流]建立一个工作流程的简明过程归纳.pdf

    本文主要介绍了如何在通达OA(Odoo Automation)系统中建立一个简单的工作流程,包括设计表单、构建流程以及新建工作这三个主要步骤。 首先,设计表单是创建工作流程的基础。在“系统管理”菜单中,选择“工作流...

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

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

    00基于工作流状态的动态访问控制.pdf

    《基于工作流状态的动态访问控制》一文探讨了如何通过引入角色的概念来改进动态访问控制系统,并且提出了一个更加灵活的安全机制来保障信息系统中的数据访问。该文首先简要回顾了传统访问控制模型的局限性,接着详细...

    把三个变量读到三个文本框,把文本框内容写到文本中

    在VC2010环境下,开发一个简单的用户界面应用程序,其功能是将三个变量的值显示在三个文本框(TextBox)中,并能将这些文本框的内容写入到文本文件中,同时提供一个清空按钮来清除文本框的显示。这个过程涉及到的...

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

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

    用socket写的一个简单的TCP通信程序

    这个程序提供了一个基本的框架,便于初学者理解TCP通信的工作原理。 1. **TCP协议**: - TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手建立连接,...

    JAVA简单的读写文本文件的代码

    - **解析**:该方法接受一个输入流和一个输出流作为参数。利用`BufferedReader`读取输入流中的每一行,并通过`PrintWriter`将这些行写入到输出流中。最后调用`flush`方法确保所有数据都被写入到输出流。 ### 4. ...

    ios-自己写的瀑布流 简单易懂 操作方便.zip

    在这个“ios-自己写的瀑布流 简单易懂 操作方便.zip”压缩包中,包含了一个瀑布流布局的实践项目,名为“瀑布流练习”。这个项目很可能展示了如何从头开始创建一个简单的瀑布流视图,使得开发者能够理解其工作原理并...

    pullstreams是一个简单的流模式用于学习pullstreams

    “pullstreams是一个简单的流模式用于学习pullstreams”这个标题表明我们要探讨的是一个与编程有关的主题,特别是关于“pull-streams”的概念。Pull-streams是一种在JavaScript生态系统中处理数据流的方式,它与常见...

    用java写的一个Tcp连接源码

    创建TCP连接是通过三次握手过程来实现的,这确保了双方在数据交换之前建立一个可靠的连接。下面我们将深入探讨如何用Java实现TCP连接,并通过源码分析来理解其工作原理。 首先,我们需要了解Java中的Socket类和...

    手写rpc rpc简单源码 rpc源码学习 rpc过程了解 rpc通信原理

    1. **调用发起**:客户端调用本地接口,实际上这是一个RPC调用。 2. **请求打包**:客户端将调用信息(如方法名、参数等)进行序列化,并封装成网络请求。 3. **网络传输**:客户端通过网络将请求发送到服务端。 ...

    自己写的简单OA系统

    【标题】"自己写的简单OA系统"所涉及的知识点主要集中在办公自动化(Office Automation, OA)系统的开发上,这是一个小型的、自定义化的OA解决方案。OA系统是企业信息化的重要组成部分,用于提高工作效率,实现无纸...

    TCP写的仿QQ程序

    【TCP写的仿QQ程序】是一个基于TCP协议实现的简易聊天程序,旨在模仿腾讯QQ的一些基本功能,如客户端与服务器端的通信、消息传递等。在这个项目中,开发者尝试构建一个简单的通讯框架,允许两个用户之间进行实时的...

    用delphi写的一个des的加密解密小程序,java写的des的一个类

    标题中的“用Delphi写的一个DES的加密解密小程序,Java写的DES的一个类”表明了这个压缩包包含两个部分:一个是使用Delphi编程语言编写的用于执行DES(Data Encryption Standard)加密和解密的小程序,另一个是用Java...

    jbpm4.4工作流开发指南pdf

    - **JBPM**:JBPM 是一个开源的工作流管理系统,它使用纯 Java 编写,可以方便地集成到 Java 应用中。JBPM 的设计目标是提供一个简单而强大的流程管理解决方案。 - **特性**: - 扩展性强:JBPM 允许开发者通过...

    ShareFlow企业工作流集成管理平台.pptx

    ### ShareFlow企业工作流集成管理平台关键知识点解析 #### 一、ShareFlow概述 - **定义**: ShareFlow是由杰思敏信息科技自主研发的企业工作流集成管理平台,它不仅是一款流程管理软件,还具备强大的管理工具功能。 ...

    基于COM 和ASP 技术的工作流管理系统的设计与实现

    基于 COM 和 ASP 技术的工作流管理系统主要包括以下几个部分: - **用户界面层**:采用 ASP 技术构建,提供友好、直观的操作界面。 - **业务逻辑层**:负责处理具体的业务逻辑,如流程定义、任务分配等,可以使用 ...

Global site tag (gtag.js) - Google Analytics