我只是用过工作流,下面是我的一些体会:
1、工作流要符合实际的需求,一定要客户化一些activity符合实际的业务
场景
2、模版设计工具非常重要,恐怕通用的一些工具不能满足实际项目的需求
3、工作流与权限密切相关,不可忽略。
综上:如果工作流的设计过分的通用,则很难满足实际的需求。所以工作
流很难做好,如果不是特别的要求,还不如实际一点好。我用过两套系统
一套不是标准的工作流,另一套是,用户说第一套好用。
banq:我们最初的控制文件也是自己用XML定义的,当时根本就不知道有XPDL,做完了发现有XPDL,再将XML按照XPDL做了一些裁减.
blublusky:同意你的观点,毕竟工作流引擎不能代表工作流平台,平台需要更多功能和符合用户使用.
我想,工作流引擎的设计要点也许可以如下描述:

1。把工作流引擎看作一个服务器,提供容器服务;
2。把任务节点放入任务容器内,以此实现任务节点的配置;
3。任务容器之间通过标准的方式进行通信;

那么,以上述方式来看待工作流引擎有什么好处呢?
好处是,这样一来,我们的思维就不再混乱,而且知道我们的主要精力应该放在思考如何进行任务的抽象(以便实现容器)和如何确定任务之间的通信方式上。

任务容器的抽象要点是:关注如何实现任务节点的配置,即任务节点之间如何进行挂接;此外,容器还要考虑任务之间的通信方式,这里我把通信方式特指为任务之间的数据交换方式。

任务节点之间的挂接策略有两种:
1。注册
向需要挂接的其他任务节点注册自己。比如在实际中有任务A和B,任务A之后到任务B:A向B注册自己,且注册的实现代码放在B中时。这是从主动者的角度思考的挂接策略,因为A是推动流程进入B的主动者,且该推动作用是用A来发起的(A主动向B注册)。
2。监听
向自身加入监听器,监听器由需要挂接到的任务节点实现。当A出现所需的事件时,B进入工作流的下一步。推动工作流的是B任务,但是却是由B引起的,所以这是从被动者的角度思考的挂接策略。

不管是注册的策略还是监听器的策略,都应该作为任务容器的一部分来实现,任务节点本身就可以集中精力来考虑自己的业务逻辑,不至于在交互上花费太多精力。Java中设计接口元素的本意就是用来实现策略,因此任务容器应该提供一套注册接口或者监听器接口以便实现挂接功能。

要实现任务节点通信方式的一致性,有两种方式:一是采用统一的数据格式,更进一步则是采用统一的数据分析策略。采用一致的数据分析策略包含了采用统一的数据格式。统一的数据格式在策略上是死板的,而一致的数据分析方式可以允许数据格式不一致,但是所有的数据都可以采用一致的数据分析策略得到一致的数据。至于如何制定一致的数据分析策略,就看设计者如何考虑了。Java的属性就是靠分析属性名得到的,它采取的就是分析策略的方式,这里面有很多好处。一致的分析策略可能比较难设计,但是有些情况下因为数据形式变化太大,很难为通信制定统一的数据格式,就有必要考虑分析策略的方式了。

我觉得做工作流最重要的是将用户所做的事情和引擎所做的事情分离,也就是将业务逻辑和流程控制逻辑完全分离。总的来说,分为3大块:流程定义、流程控制、业务逻辑。这3块之间做到完全分离,其中定义数据通过数据库或者以wpdl格式存储。引擎通过定义数据进行任务之间的流转,并提供给业务调用的接口,至于审批、提交等可以定义为操作,由具体的任务处理。
举个网上购书的例子,用户所要进行的操作大致有:发送购书申请,填写定单,定单确认。系统所要做的有:确认申请、弹出定单填写页面、确认并保存定单、发送定单给送货task(其中确认定单可以让统一的认证系统处理)。
流程定义定义两个task:定单申请task和送货task。
a 引擎接收请求后,根据定义数据,查找定单申请task对应的入口处理程序(定单填写页面),返回。
b 用户填写后,提交,业务系统确认并保存后,向引擎发出请求,引擎找出下一task(送货task),发出消息,完毕。
在这个例子中分为对用户的权限认证和对task的权限认证,前者属于业务系统处理,后者由在进入引擎之前处理。
我任务工作流主要目的就是为了让日常的工作流程自动化,把日常的工作流程抽象为工作流模型。
引擎只是负责各个节点(活动)直接的转移逻辑,至于每个节点具体要做什么事情,那是业务层需要关心的事情,当然,一个好的引擎应该内置一些基本的功能,来方便业务节点的实现,例如email,jms,cobra等应用代理.
任务的交互通过api来完成,例如AssignmentService.complete(long assignmentId)这种方式,和引擎进行交互,从而到达控制节点流转的目的.
至于权限,我个人倾向于在业务层解决,引擎只是负责它应该负责的事情(流程导航),当然在定义中可以加入权限的控制,这样的好处就是方便制定和修改,而且和流程建模可以统一起来.
权限应该作为任务容器的一个组件,提供一套认证接口供容器调用,然后权限组件自身实现权限的配置。工作流引擎在用户登录时从某种渠道或用某种方式分配给该用户一个身份,然后引擎调用权限组件的认证接口进行验证。
没想到居然上了头条,哈哈。感谢这么多高手来参与,小弟现在感觉思路开阔多了。
谢谢banq!
关于权限,我和大家的想法一样,这也是Jdon论坛里经过大量讨论形成的共识,而且我已经实现了这个想法(一个独立的权限模块,有兴趣可以另开贴子)。

dragon_jdh的观点给我很多启发,等我实践之后再回来和你们深入探讨吧。

刚刚写了一个学习心得交给项目经理,也请各位批评指正:

工作流引擎运行原理
概念:
一、 工作流引擎:控制部署在其上的工作流的生命周期,产生相关的任务列表可以把他比喻成操作系统。
二、 工作流模型:即工作流的定义,以一个(.xpdl)文档的形式存在,可以把他比喻成应用程序的源代码。
三、 工作流实例:工作流模型在引擎上的一个部署,部署包括模型中生命的资源、变量的注册和绑定,可以比喻成一个部署好的应用。
四、 工作流进程:工作流的一次运行、一个任务,相应的,可以比作应用的一个进程(process)。
五、 活动:actionID,actionName, actionURI,parametersMap


六、 表单:一个数据结构,包含若干个字段,可以比作数据库的模式(表结构)
七、 报表:某一类表单按照一定的条件过滤筛选后的结果,可以比作数据库中的表和视图。
八、 表单和报表并不在工作流中流转(他只存在于报表服务器),它记录并知道自己属于哪个工作流;工作流引擎只与活动打交道,工作流引擎知道如何给活动传递参数,如何从活动取得结果,这样活动就能够在工作流与报表服务器之间传递相关数据了。
工作流运行机制:
因为工作流系统是一个典型的异步系统,适合采用基于消息的设计,J2EE为我们提供了JMS和MDB这两种有力的工具,这也给我们的设计定下了大的基调。
一、事件触发的工作流:
(用word画的简单流程图)…………

二、时间触发的工作流:(例如每周工作报告、季度考核报告)

>>我打算不会采取applet或Swing这样重量客户端,我做的工作流定制是介于标准工作流和实际应用之间,并综合JMS、 RBAC等技术,我目前感觉只要Jsp/Html这样普通界面就可以了。

我觉得不大可能吧,对于简单的流程,完全可以使用jsp/html完成,但是对于一些复杂的流程,比如有转办、流程的分化和会合操作,如何通过jsp/html完成;况且对于每一步的操作都需要请求服务器,这样的操作将会非常的慢;

图中所示是我们公司使用的PLM产品中的工作流定制功能,定制工作流通过Applet来操作的,非常灵活。

你好!
我倒实现过一个工作流引擎,是使用C++开发的,基本按照WFMC标准去实现,流程设计是使用JAVA做(用JAVA SWING同样可以做出很棒的图形界面),我觉得客户调用的问题确实需要考虑仔细,当时我们使用的是WEB SERVICE的方式去使用,但后来发现性能并不怎么理想,因为WFMC定义的WAPI很多,在流程运行时多次交互不可避免,用XML传送数据,解析和合成都会耗去很大的时间,后来解决方案是合并了很多WAPI,性能稍好了些,但我觉得如果能够合理的控制交互,一般1到3秒的等待时间客户还是可以忍受的,而WEB SERVICE又可以被其它语言调用,我们当时的系统就是C++和JAVA混合的,不妨一试:)
你好!
我倒实现过一个工作流引擎,是使用C++开发的,基本按照WFMC标准去实现,流程设计是使用JAVA做(用JAVA SWING同样可以做出很棒的图形界面),我觉得客户调用的问题确实需要考虑仔细,当时我们使用的是WEB SERVICE的方式去使用,但后来发现性能并不怎么理想,因为WFMC定义的WAPI很多,在流程运行时多次交互不可避免,用XML传送数据,解析和合成都会耗去很大的时间,后来解决方案是合并了很多WAPI,性能稍好了些,但我觉得如果能够合理的控制交互,一般1到3秒的等待时间客户还是可以忍受的,而WEB SERVICE又可以被其它语言调用,我们当时的系统就是C++和JAVA混合的,不妨一试:)
JDK中有个TIMER,对时间触发的工作流可以用TIMERTASK去触发
copper,感谢你的帮助。
不知你说的“客户调用的问题”指的是WfMC (Workflow Management Coalition) 规范中给出的五接口参考模型中的哪个接口?
流程定义数据和接口(Interface 1)
流程客户应用数据和接口(Interface 2)
应用程序集成接口(Interface 3)
服务器并行控制接口(Interface 4)
系统管理和监控接口(Interface 5)

我想应该是Interface2 吧。