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

上午测试了下并发情况下的表现,测试场景:一个有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
### 构建简单自定义工作流引擎的实现思路 构建一个简单的自定义工作流引擎涉及多个方面,包括设计模式的选择、数据存储的设计以及具体的编程实践。以下是详细的实现思路: #### 设计模式选择 为了使工作流引擎具有良好的可维护性和扩展性,推荐采用面向对象设计原则中的责任链模式和状态模式。这两种模式可以帮助清晰地分离不同阶段的任务逻辑。 - **责任链模式**:用于管理一系列处理器节点之间的传递关系,使得请求可以在这些节点间依次流动直到被处理完成。 - **状态模式**:允许对象在其内部状态改变时调整其行为。对于复杂的工作流程来说,这有助于简化业务逻辑并提高系统的灵活性[^1]。 #### 数据库表结构规划 合理规划数据库表结构至关重要。通常至少需要个核心表格来支撑基本功能: - `workflows` 表保存整个工作流的信息; - `tasks` 表记录每个独立任务的数据及其属性; - `transitions` 或者称为路径表用来描述任务间的转换条件与顺序。 ```sql CREATE TABLE workflows ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), description TEXT ); CREATE TABLE tasks ( id INT PRIMARY KEY AUTO_INCREMENT, workflow_id INT NOT NULL, title VARCHAR(255), status ENUM('pending', 'in_progress', 'completed') DEFAULT 'pending', FOREIGN KEY (workflow_id) REFERENCES workflows(id) ); ``` #### 编程接口设计 通过Python语言作为例子展示如何创建基础类来进行交互操作。这里会涉及到几个主要组件——WorkflowManager, TaskHandler 和 TransitionEvaluator. ```python class WorkflowManager: def __init__(self): self.workflows = {} def add_workflow(self, wf_name, task_list=None): new_wf = {"name": wf_name} if isinstance(task_list, list): new_wf["tasks"] = {t.id: t for t in task_list} self.workflows[wf_name] = new_wf class TaskHandler: def execute_task(self, task_id): pass # Implement specific logic here def update_status(self, task_id, new_state): pass # Update the state of a given task class TransitionEvaluator: @staticmethod def evaluate_transition(current_task, next_tasks_conditions): """Evaluate whether we can move to any one of the provided next tasks.""" pass # Logic implementation required ``` #### 测试驱动开发(TDD) 遵循测试先行的原则,在编任何生产代码之前先出单元测试案例。这样可以确保每一步都按照预期执行,并且能够快速定位错误源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值