- 浏览: 940326 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
昨天晚上搞到深夜,终于将资源模块搞定。到今天已经完成的功能包括:
1.四种基本路由:顺序、选择、并行、循环
2.流程定义文件和系统配置文件的读取和解析
3.使用内存作为流程数据和案例数据存储的MemoryWorkFlowDAO的开发
4.资源模块的开发
5.并发情况下的正确性测试等
计划中的功能:
1.一个GUI的流程定义工具,这个不急,也还没想好用什么做,web还是桌面?
2.各个数据库版本的WorkFlowDAO的开发,将流程数据和案例数据保存在数据库中。
3.更多的测试和example试验。
回到资源这个概念,工作流中工作项(work item)的由资源来驱动的,这个资源(resource)可能是用户、角色、定时时间或者某个事件消息。在标准petri网中,工作项对应于 transition(变迁),变迁都是自动的,不需要所谓资源来驱动,显然,这与工作流系统不同。具体到insect workflow(我取的名字,小巧之意),每个transition都有一个resource,用于驱动自身的firing,所有的resource都 实现Resource接口:
每个资源都有一个类型,以及这个类型中独一无二的id,start方法用于驱动transtion的firing。一般情况下,你不需要实现这个接口,只 要继承这个接口的抽象实现类AbstractResource,AbstractResource的start方法默认实现是首先调用模板方法 doAction(稍后解释),然后检查触发条件,如果通过就直接调用transition的fire方法:
Transtion类的fire方法有三个操作组成:从输入库所移走token,往输出库所放入token,回调handler:
那么具体的资源显然要实现AbstractResource中的doAction抽象方法,系统内置了五种资源:自动资源(AutoResource)、 用户(User)、用户组(Group)、定时器(TimerResource)和事件监听器(ObserverResource)。显然, AutoResource、User和Group的doAction方法不需要做任何事情:
而TimerResource就需要做特殊处理了,比如我们要达到这样的效果:节点1状态已经处于就绪,可以被触发,可我们希望在就绪后延迟半分钟再触 发,或者在晚上10点触发等等。这样的定时需求很常见,我采用了jdk5引入的ScheduledExecutorService来处理。系统中启动这样 一个线程池,每个类似上面的请求都提交给这个线程池来处理,那么TimerResource就需要进行相应的修改:
注意到,start方法不再是直接调用transition的fire方法,而仅仅是进行了第一步操作:移除输入库所的place防止重复提交。后两步操作都延迟到了提交给线程池的任务中,也就是代码中的ChangeRunner类中的run方法。例如TimerResource的子类DelayTimerResource用于处理延迟的触发,doAction就像这样:
延迟的时间,时间单位这些信息都可以在流程定义文件中设置。事件监听器资源与此类似,ObserverResource实现了 java.util.Observer接口,往输出库所放入token和回调handler两步操作被放在了update方法中提供给Subject回 调。
1.四种基本路由:顺序、选择、并行、循环
2.流程定义文件和系统配置文件的读取和解析
3.使用内存作为流程数据和案例数据存储的MemoryWorkFlowDAO的开发
4.资源模块的开发
5.并发情况下的正确性测试等
计划中的功能:
1.一个GUI的流程定义工具,这个不急,也还没想好用什么做,web还是桌面?
2.各个数据库版本的WorkFlowDAO的开发,将流程数据和案例数据保存在数据库中。
3.更多的测试和example试验。
回到资源这个概念,工作流中工作项(work item)的由资源来驱动的,这个资源(resource)可能是用户、角色、定时时间或者某个事件消息。在标准petri网中,工作项对应于 transition(变迁),变迁都是自动的,不需要所谓资源来驱动,显然,这与工作流系统不同。具体到insect workflow(我取的名字,小巧之意),每个transition都有一个resource,用于驱动自身的firing,所有的resource都 实现Resource接口:
java 代码
- public interface Resource extends Serializable {
- public void start(Transition transition, Token token, Object args);
- public ResourceType getType();
- public long getId();
- }
每个资源都有一个类型,以及这个类型中独一无二的id,start方法用于驱动transtion的firing。一般情况下,你不需要实现这个接口,只 要继承这个接口的抽象实现类AbstractResource,AbstractResource的start方法默认实现是首先调用模板方法 doAction(稍后解释),然后检查触发条件,如果通过就直接调用transition的fire方法:
java 代码
- public abstract class AbstractResource implements Resource {
- public void start(Transition transition, Token token, Object args) {
- doAction(transition, token, args);
- if (transition.getCondition() != null
- && !transition.getCondition().check(token))
- throw new ConditionException(transition.getName()
- + " transition没有满足触发条件");
- transition.fire(token, args);
- }
- public abstract void doAction(Transition transition, Token token,
- Object args) ;
- }
Transtion类的fire方法有三个操作组成:从输入库所移走token,往输出库所放入token,回调handler:
java 代码
- public void fire(Token token, Object args) {
- removeTokenFromInputs(token);
- addTokenToOutputs(token);
- invokeHandler(token, args);
- }
那么具体的资源显然要实现AbstractResource中的doAction抽象方法,系统内置了五种资源:自动资源(AutoResource)、 用户(User)、用户组(Group)、定时器(TimerResource)和事件监听器(ObserverResource)。显然, AutoResource、User和Group的doAction方法不需要做任何事情:
java 代码
- public class User extends AbstractResource {
- protected Group group;
- @Override
- public void doAction(Transition transition, Token token, Object arg){
- }
- }
而TimerResource就需要做特殊处理了,比如我们要达到这样的效果:节点1状态已经处于就绪,可以被触发,可我们希望在就绪后延迟半分钟再触 发,或者在晚上10点触发等等。这样的定时需求很常见,我采用了jdk5引入的ScheduledExecutorService来处理。系统中启动这样 一个线程池,每个类似上面的请求都提交给这个线程池来处理,那么TimerResource就需要进行相应的修改:
java 代码
- public abstract class TimerResource extends AbstractResource {
- protected int pool_size;
- protected static ScheduledExecutorService scheduledExecutorService;
- @Override
- public long getId() {
- // TODO Auto-generated method stub
- return Common.TIMER_RESOURCE_ID;
- }
- public TimerResource() {
- this.pool_size = 5;
- scheduledExecutorService = Executors.newScheduledThreadPool(pool_size);
- }
- public static void shutdownPool() {
- if (scheduledExecutorService != null)
- scheduledExecutorService.shutdown();
- }
- public final void start(Transition transition, Token token, Object args)
- throws InterruptedException {
- if (transition.getCondition() != null
- && !transition.getCondition().check(token))
- throw new ConditionException(transition.getName()
- + " transition没有满足触发条件");
- transition.removeTokenFromInputs(token);
- doAction(transition, token, args);
- }
- protected class ChangeRunner implements Runnable {
- private Transition transition;
- private Token token;
- private Object[] args;
- public ChangeRunner(Transition transition, Token token, Object args) {
- this.transition = transition;
- this.token = token;
- this.args = args;
- }
- public void run() {
- if (transition.getCondition() != null
- && !transition.getCondition().check(token))
- throw new ConditionException(transition.getName()
- + " transition没有满足触发条件");
- transition.addTokenToOutputs(token);
- Object real_args[] = new Object[args.length - 2];
- for (int i = 0; i < real_args.length; i++)
- real_args[i] = args[i + 2];
- transition.invokeHandler(token, real_args);
- try {
- // 回调
- ((WorkFlowAlgorithm) args[1]).enabledTraversing(token
- .getWorkFlow());
- ((WorkFlowManager) args[0]).doAction(token.getId());
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
- }
注意到,start方法不再是直接调用transition的fire方法,而仅仅是进行了第一步操作:移除输入库所的place防止重复提交。后两步操作都延迟到了提交给线程池的任务中,也就是代码中的ChangeRunner类中的run方法。例如TimerResource的子类DelayTimerResource用于处理延迟的触发,doAction就像这样:
java 代码
- public class DelayTimerResource extends TimerResource {
- @Override
- public void doAction(Transition transition, Token token, Object args){
- scheduledExecutorService.schedule(new ChangeRunner(transition, token,
- args), this.delay, this.timeUnit);
- }
- }
延迟的时间,时间单位这些信息都可以在流程定义文件中设置。事件监听器资源与此类似,ObserverResource实现了 java.util.Observer接口,往输出库所放入token和回调handler两步操作被放在了update方法中提供给Subject回 调。
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8546一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3523充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4883翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 4122xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4223俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3118yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 74761、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5399yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7585在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1866项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3052过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2047项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5746阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2118典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 1998这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2784前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8119分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2141HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10838Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28861、如果用java6的ScriptEngineManager ...
相关推荐
结构化异常处理方法中的异常传播和处理机制为工作流系统的异常处理提供了一个很好的借鉴模式。这种TRY-CATCH-FINALLY模式的异常处理过程如下: - 在TRY模块中检测程序运行情况,如果发生错误,则抛出异常; - 程序...
5. **用户界面**:为了与用户交互,工作流系统通常会有一个简单的管理界面,用于启动流程、分配任务、查看流程状态等。这部分可能包含Servlet或JSP页面,以及相关的后台控制逻辑。 6. **配置和扩展**:为了适应不同...
本实例主要介绍如何在WinForms中创建一个简单的Workflow工作流,即“Hello World”示例。 首先,我们需要创建一个WinForms项目。在Visual Studio中,选择“新建项目”,然后在模板中找到“Windows Forms应用程序”...
1. **图形化界面**:用户可以通过拖拽节点和连接线来构建工作流程,每个节点代表一个任务或决策,连接线则表示任务间的流转关系。 2. **自定义工作流**:用户可以根据需求自定义不同类型的节点和工作流逻辑,例如...
该时间异常处理方法在一个实际的产品创新设计领域的工作流系统中进行了实现与验证。通过模拟不同的异常场景,验证了该方法的有效性和可行性。实验结果显示,该方法能够有效地预测并处理时间异常,显著降低了异常对...
2. jBPM:jBPM 是一个全面的业务流程管理系统,不仅包含工作流引擎,还包括规则引擎、事件处理和决策支持,支持BPMN 2.0标准。 3. Camunda:Camunda 是一个轻量级的BPM平台,提供工作流引擎、模型er和监控工具,支持...
工作流管理基础是IT领域中一个重要的概念,它涉及到企业业务流程自动化、协同工作和信息系统的集成。在本文中,我们将深入探讨工作流的核心概念、关键技术和应用。 工作流(Workflow)可以理解为企业或组织中任务、...
例如,一个简单的请假申请流程可以视为一个工作流实例,其中包括员工提交申请、经理审批、人力资源部门记录等步骤。每个步骤都可能涉及不同的参与者,并且可能有特定的条件和规则,如审批权限、假期天数限制等。 在...
在给定的资源中,“工作流资料+DEMO源代码”包含了一个名为“NetronLight工作流软件源码.rar”的压缩包,以及一份“工作流资料”,这为我们提供了一个研究和学习工作流管理系统实现的宝贵机会。 首先,我们来详细...
工作流管理系统是一个软件应用,它负责存储流程定义,并通过工作流引擎来执行这些定义。工作流引擎是系统中的执行模块,负责在运行时按照定义的规则推进流程。流程定义工具是创建和修改流程定义的软件,它可以帮助...
在IT领域,工作流是一种自动化业务过程的工具,它能够按照预定义的规则和步骤来协调计算机系统之间的任务。...总之,"C#,一个学习工作流的好例子"是一个宝贵的教育资源,有助于提升开发者在工作流开发领域的技能。
本文主要探讨了如何利用Spring框架实现简单工作流,将Spring作为一个轻量级的工作流引擎。工作流在许多J2EE应用程序中扮演着重要角色,尤其在处理后台任务和流程控制时。Spring容器通过控制反转(IoC)和依赖注入...
在“RDProject-master”这个压缩包文件中,可能包含了使用DevExpress开发的一个具体工作流项目,包括源代码、设计文件、配置文件等资源。通过深入研究这个项目,开发者不仅可以了解DevExpress工作流组件的使用方法,...
在这个“SSH简单工作流系统”中,开发者可能已经创建了一个人力资源管理(HRSystem)的示例应用。工作流系统通常涉及到任务审批、流程定义、状态转移等元素,这些可以通过Struts2的Action和Spring的Service层来实现...
"WorkFlow C++ 工作流图形"是一个专注于在C++环境中实现工作流管理的图形化库。工作流,简单来说,就是一系列按照特定顺序执行的任务或活动,它在企业管理、软件开发、流程自动化等领域中广泛应用。C++作为一门强大...
在当前的遥感技术领域,针对地面遥感数据处理系统运行控制的研究,尤其是如何高效处理大规模遥感数据,已成为一个重要的研究课题。随着空间分辨率、时间分辨率、光谱分辨率和辐射分辨率的不断提高,数据处理量也在...
总的来说,这个资源集合为学习和实施C#工作流提供了一个全面的平台,涵盖了从理论到实践的各个层面。无论是对工作流原理的深入理解,还是在实际项目中的应用,都将受益匪浅。通过研究源码、阅读论文和笔记,你将能够...
工作流技术及应用是软件工程领域的一个重要组成部分,它涉及到企业流程管理、自动化以及协作的方方面面。工作流技术主要用于设计、执行和管理按照一定规则进行的一系列任务或业务过程,以提升效率,优化业务流程,并...
总之,这个“php 工作流源码”是一个全面的学习资源,涵盖了从后端逻辑到前端交互的完整工作流系统实现。对于想要深入理解工作流管理和PHP开发的开发者来说,这是一个宝贵的实践案例。通过研究这个源码,你可以学习...