閱讀445 返回首頁    go 阿裏雲 go 技術社區[雲棲]


寫一個簡單的工作流(三)

上午測試了下並發情況下的表現,測試場景:一個有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

最後更新:2017-05-17 17:01:46

  上一篇:go  寫一個簡單的工作流(四)資源的處理
  下一篇:go  寫一個簡單的工作流(二)