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

    xiaoxiao2024-06-29  113

    上午测试了下并发情况下的表现,测试场景:一个有20个节点,包括选择、顺序、并行路由的流程,所有节点都设置为自动执行,1000个线程并发启动案例,也就是这个流程同时有1000个案例在跑,全部跑完结果差强人意,比单线程慢了接近30倍。仔细调整了算法和加锁粒度,尽管整体性能有所提高,但是多线程和单线程间执行的差距仍然没有多大变化,性能瓶颈还是在核心的调度算法上,还需要分析下。测试程序如下: package  net.rubyeye.insect.workflow.test; import  java.util.ArrayList; import  java.util.List; import  java.util.concurrent.CyclicBarrier; import  net.rubyeye.insect.workflow.Place; import  net.rubyeye.insect.workflow.Token; import  net.rubyeye.insect.workflow.Transition; import  net.rubyeye.insect.workflow.WorkFlow; import  net.rubyeye.insect.workflow.WorkFlowManager; import  net.rubyeye.insect.workflow.basic.BasicWorkflowManager; import  net.rubyeye.insect.workflow.comm.TransitionType; import  net.rubyeye.insect.workflow.config.DefaultConfiguration; import  junit.framework.TestCase; public   class  CompositeProcessTest  extends  TestCase {      private  WorkFlowManager wm;     WorkFlow composite;      private  CyclicBarrier barrier;      private   static   final   int  total  =   1000 ;     @Override      protected   void  setUp()  throws  Exception {          this .barrier  =   new  CyclicBarrier(total  +   1 );         wm  =   new  BasicWorkflowManager();         wm.setConfiguration( new  DefaultConfiguration());         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);     }      public   void  testConcurrencyCompositeProcesss()  throws  Exception {          for  ( int  i  =   0 ; i  <  total; i ++ ) {              new  FlowThread().start();         }         barrier.await();          long  start  =  System.currentTimeMillis();         barrier.await();          long  end  =  System.currentTimeMillis();         System.out.println( " 创建 "   +  total  +   " 个流程并发运行完毕\n花费时间: "   +  (end  -  start)                  /   1000.0   +   " " );          for  (Transition transition : composite.getTransitions()) {             System.out.println(transition.getName()  +   "    "                      +  transition.isEnable());              for  (Place place : transition.getOutputs()) {                 System.out.println( " place  "   +  place.getId()  +   "   "                          +  place.getTokens().size());             }         }     }      public   void  testCompositeProcesss()  throws  Exception {          long  start  =  System.currentTimeMillis();          for  ( int  i  =   0 ; i  <  total; i ++ ) {             Token token1  =  wm.startWorkFlow( " composite " );             token1.setAttribute( " name " " dennis " );             token1.setAttribute( " num " 21 );             wm.doAction(token1.getId());             assertTrue(token1.isFinished());         }          long  end  =  System.currentTimeMillis();         System.out.println( " 创建 "   +  total  +   " 个流程运行完毕\n花费时间: "   +  (end  -  start)                  /   1000.0   +   " " );     }      class  FlowThread  extends  Thread {         @Override          public   void  run() {              try  {                 barrier.await();                  //  wm = new BasicWorkflowManager();                 Token token1  =  wm.startWorkFlow( " composite " );                 token1.setAttribute( " name " " dennis " );                 token1.setAttribute( " num " 21 );                 wm.doAction(token1.getId());                 assertTrue(token1.isFinished());                 barrier.await();             }  catch  (Exception e) {                  throw   new  RuntimeException(e);             }         }     } } 文章转自庄周梦蝶  ,原文发布时间2007-10-12
    最新回复(0)