博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写一个简单的工作流(三)
阅读量:6329 次
发布时间:2019-06-22

本文共 3481 字,大约阅读时间需要 11 分钟。

上午测试了下并发情况下的表现,测试场景:一个有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

转载地址:http://rfzoa.baihongyu.com/

你可能感兴趣的文章
备用数据库快照
查看>>
编写shell脚本计划备份mysql数据库
查看>>
单页面应用简介
查看>>
Word 2003中编辑标记与格式标记大讨论
查看>>
从国内向海外转移域名经验谈
查看>>
浅谈apache与tomact的整合
查看>>
详解XStream别名
查看>>
SQL Server vNext CTP1 on Linux
查看>>
1-为 Lync Server 2010 准备 Active Directory 域服务
查看>>
Grid Control 10G安装与配置
查看>>
SELinux安全
查看>>
NetBackup下ORACLE恢复测试方案实例解析
查看>>
【有奖征文】“失业”程序员的苦辣酸甜
查看>>
IE9是如何被FireFox4超越全球市场份额的?
查看>>
linux bunzip2命令
查看>>
敏捷个人:通过实践TOGAF来思考如何学习并应用新的方法?
查看>>
Android系统的开机画面显示过程分析(6)
查看>>
vivo Hi-Fi+QQ音乐 数字音乐市场的一剂良方
查看>>
Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结
查看>>
聚焦触宝反侵权事件:中国创业者用什么护航海外市场大门
查看>>