上午測試了下并發(fā)情況下的表現(xiàn),測試場景:一個(gè)有20個(gè)節(jié)點(diǎn),包括選擇、順序、并行路由的流程,所有節(jié)點(diǎn)都設(shè)置為自動(dòng)執(zhí)行,1000個(gè)線程并發(fā)啟動(dòng)案例,也就是這個(gè)流程同時(shí)有1000個(gè)案例在跑,全部跑完結(jié)果差強(qiáng)人意,比單線程慢了接近30倍。仔細(xì)調(diào)整了算法和加鎖粒度,盡管整體性能有所提高,但是多線程和單線程間執(zhí)行的差距仍然沒有多大變化,性能瓶頸還是在核心的調(diào)度算法上,還需要分析下。測試程序如下:
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);
// 修改開始結(jié)束節(jié)點(diǎn)的輸入輸出庫所
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("創(chuàng)建" + total + "個(gè)流程并發(fā)運(yùn)行完畢\n花費(fèi)時(shí)間:" + (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("創(chuàng)建" + total + "個(gè)流程運(yùn)行完畢\n花費(fèi)時(shí)間:" + (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);
}
}
}
}
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);
// 修改開始結(jié)束節(jié)點(diǎn)的輸入輸出庫所
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("創(chuàng)建" + total + "個(gè)流程并發(fā)運(yùn)行完畢\n花費(fèi)時(shí)間:" + (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("創(chuàng)建" + total + "個(gè)流程運(yùn)行完畢\n花費(fèi)時(shí)間:" + (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);
}
}
}
}