成都心情

  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  98 随笔 :: 2 文章 :: 501 评论 :: 1 Trackbacks

2007-04-16   版权声明

我知道这篇文章阅读量很大,但是请要继续转载本文的同志注意一下,本文是我于 2005 年中旬在成都麦柯系统集成有限公司写的,作为公司的技术探索并希望应用在公司 OA 产品中。请保留原文版权信息 OK?

----------------------------------------------------------------------------------------------

前 言

    本文没有抛出可运行的范例,仅仅是程序片断而已,不过在 OSWorkflow 的 Wiki 上,Quake Wang 已把官方入门教程完整地翻译成中文了,有兴趣的读者可去阅读。关于 OSWorkflow 更加细节性的内容,可参考官方手册,相信你在了解了入门教程后,可轻松阅读官方手册。
   
OSWorkflow 概念

    在商用和开源世界里,OSWorkflow 都不同于这些已有的工作流系统。最大不同在于 OSWorkflow 有着非常优秀的灵活性。在开始接触 OSWorkflow 时可能较难掌握(有人说不适合工作流新手入门),比如,OSWorkflow 不要求图形化工具来开发工作流,而推荐手工编写 xml 格式的工作流程描述符。它能为应用程序开发者提供集成,也能与现有的代码和数据库进行集成。这一切似乎给正在寻找快速“即插即用”工作流解决方案的人制造了麻烦,但研究发现,那些“即插即用”方案也不能在一个成熟的应用程序中提供足够的灵活性来实现所有需求。
   
OSWorkflow 优势

    OSWorkflow 给你绝对的灵活性。OSWorkflow 被认为是一种“低级别”工作流实现。与其他工作流系统能用图标表现“loops(回路)”和“conditions(条件)”相比,OSWorkflow 只是手工“编码(coded)”来实现的。但这并不能说实际的代码是需要完全手工编码的,脚本语言能胜任这种情形。OSWorkflow 不希望一个非技术用户修改工作流程,虽然一些其他工作流系统提供了简单的 GUI 用于工作流编辑,但像这样改变工作流,通常会破坏这些应用。所以,进行工作流调整的最佳人选是开发人员,他们知道该怎么改变。不过,在最新的版本中,OSWorkflow 也提供了 GUI 设计器来协助工作流的编辑。

    OSWorkflow 基于有限状态机概念。每个 state 由 step ID 和 status 联合表现(可简单理解为 step 及其 status 表示有限状态机的 state)。一个 state 到另一 state 的 transition 依赖于 action 的发生,在工作流生命期内有至少一个或多个活动的 state。这些简单概念展现了 OSWorkflow 引擎的核心思想,并允许一个简单 XML 文件解释工作流业务流程。

OSWorkflow 核心概念
   
step(步骤)
    一个 step 是工作流所处的位置。可能从一个 step 流转到另外一个 step(或者有时候还是停留在一样的 step)。举例来说,一个 OA 系统的请假流程,它的 step 名称可能有“本部门审批阶段”,“办公室审批阶段”,“总经理审批阶段”等。
 
status(状态)
    工作流 status 是一个用来描述工作流程中具体步骤状态的字符串。OSWorkflow 的有 Underway(进行中)、Queued(等候处理中)、Finished(完成)三种 status。
 
action(动作)
    action 指定了可能发生在 step 内的转变,会导致 step 的变更。在 OA 系统中,“本部门审批阶段”可能有“拒绝”或“批准”两个 action。action 和 step 之间的关系是,step 说明“在哪里”,action 说明“可以去哪里”。 一个 action 典型地由两部分组成:可以执行此动作的 condition(条件),以及执行此动作的 result(结果)。
 
condition(条件)
    类似于逻辑判断,可包含“AND”和“OR”逻辑。比如一个请假流程中的“本部门审批阶段”,该阶段利用“AND”逻辑,判断流程状态是否为等候处理中,以及审批者是否为本部门主管。
   
result(结果)
    Result 代表指向新的 step 及其 step status,也可能进入 split 或者 join。Result 分为两种, contidional-result (有条件结果),只有条件为真时才使用该结果,和 unconditional-result(无条件结果),当条件不满足或没有条件时使用该结果。

split/join(分离/连接)
流程的切分和融合。很简单的概念,split 提供多个 result;join 则判断多个 current step 的状态,提供一个 result。

OSWorkflow 包用途分析及代码片断
   
com.opensymphony.workflow
    该包为整个 OSWorkflow 引擎提供核心接口。例如 com.opensymphony.workflow.Workflow 接口,可以说,实际开发中的大部分工作都是围绕该接口展开的,该接口有 BasicWorkflow、EJBWorkflow、OfbizWorkflow 三个实现类。

com.opensymphony.workflow.basic
    该包有两个类,BasicWorkflow 与 BasicWorkflowContext。BasicWorkflow 不支持事务,尽管依赖持久实现,事务也不能包裹它。BasicWorkflowContext 在实际开发中很少使用。

  public void setWorkflow(int userId) {
  Workflow workflow = new BasicWorkflow(Integer.toString(userId));
 }

com.opensymphony.workflow.config
    该包有一个接口和两个该接口的实现类。在 OSWorkflow 2.7 以前,状态由多个地方的静态字段维护,这种方式很方便,但是有很多缺陷和约束。最主要的缺点是无法通过不同配置运行多个 OSWorkflow 实例。实现类 DefaultConfiguration 用于一般的配置文件载入。而 SpringConfiguration 则是让 Spring 容器管理配置信息。

  public void setConfiguration(SpringConfiguration configuration) {
  SpringConfiguration configuration = configuration;
workflow.setConfiguration(configuration);
 }

com.opensymphony.workflow.ejb
    该包有两个接口 WorkflowHome 和 WorkflowRemote。该包的若干类中,最重要的是 EJBWorkflow,该类和 BasicWorkflow 的作用一样,是 OSWorkflow 的核心,并利用 EJB 容器管理事务,也作为工作流 session bean 的包装器。

com.opensymphony.workflow.loader
    该包有若干类,用得最多的是 XxxxDescriptor,如果在工作流引擎运行时需要了解指定的动作、步骤的状态、名字,等信息时,这些描述符会起到很大作用。

  public String findNameByStepId(int stepId,String wfName) {
  WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName);
  StepDescriptor stepDes = wd.getStep(stepId);
  return stepDes.getName();
 }

com.opensymphony.workflow.ofbiz
    OfbizWorkflow 和 BasicWorkflow 在很多方面非常相似,除了需要调用 ofbiz 的 TransactionUtil 来包装事务。

com.opensymphony.workflow.query
    该包主要为查询而设计,但不是所有的工作流存储都支持查询。通常,Hibernate 和 JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持混合型查询(例如,一个查询同时包含了 history step 上下文和 current step 上下文)。执行一个查询,需要创建 WorkflowExpressionQuery 实例,接着调用 Workflow 对象的 query 方法来得到最终查询结果。

  public List queryDepAdmin(int userId,int type) {
  int[] arr = getSubPerson(userId,type);

  //构造表达式
  Expression[] expressions = new Expression[1 + arr.length];
  Expression expStatus = new FieldExpression(FieldExpression.STATUS,
    FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Queued");
  expressions[0] = expStatus;

  for (int i = 0; i < arr.length; i++) {
   Expression expOwner = new FieldExpression(FieldExpression.OWNER,
     FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS,
     Integer.toString(arr[i]));
   expressions[i + 1] = expOwner;
  }

  //查询未完成流编号
  List wfIdList = null;
  try {
   WorkflowExpressionQuery query = new WorkflowExpressionQuery(
     new NestedExpression(expressions, NestedExpression.AND));
   wfIdList = workflow.query(query);
  } catch (Exception e) {
   e.printStackTrace();
  }


com.opensymphony.workflow.soap
    OSWorkflow 通过 SOAP 来支持远端调用。这种调用借助 WebMethods 实现。

com.opensymphony.workflow.spi
    该包可以说是 OSWorkflow 与持久层打交道的途径,如当前工作流的实体,其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler。

  HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate()
     .find("from HibernateWorkflowEntry where Id="
         + wfIdList.get(i)).get(0);

com.opensymphony.workflow.util
该包是 OSWorkflow 的工具包,包括了对 BeanShell、BSF、EJB Local、EJB Remote、JNDI 的支持。

小 结

    由于本人所在公司希望在 OA 系统中引入工作流引擎,经过分析决定采用 OSWorkflow 引擎。利用 OSWorkflow,已经在系统中实现了请假条流程原型,该流程结合 OA 系统中已有的 RBAC 模型进行逐级审核。我个人认为要用 OSWorkflow 让某个流程跑起来似乎很麻烦,主要是需要扩展和自己实现的太多。
   
    另外,引用一段 Quake Wang 的原话:电子政务/OA 如果要使用workflow engine的话,shark,jbpm 之类的workflow engine有点杀鸡用牛刀的味道。shark 和 jbpm 都强迫你使用它的用户模型,怎样把企业现有的用户模型(包括组织结构)映射过来是很繁琐的事情,比如常见的 OA 应用中,申请者对应的部门负责人为下一个流程的人工参与者,使用 shark 或者 jbpm 都得绕一圈,通过现有的人力资源系统,获得用户,再对应过来。这还仅仅是一个简单的需求,更不用说国内企业千奇百怪的组织结构,以及各种特殊流程,用 wfmc 或者其他所谓的 workflow 通用标准去做不怎么标准的事情。吃力不讨好。用 osworkflow 这种基于状态机的 workflow engine 反而会轻松很多,而且它也没有强迫你使用它的用户模型。另外纠正一点:osworkflow 不仅仅支持简单的 BeanShell,还支持 java class,bsf,ejb。如果做电子政务/OA 的话,觉得目前 osworkflow 是最适用的 opensource workflow engine。


请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:http://www.blogjava.net/rosen

posted on 2005-08-12 09:59 Rosen 阅读(8339) 评论(29)  编辑  收藏 所属分类: 工作流

评论

# re: OSWorkflow 探索 2005-10-23 00:37 锋锋
很好的入门介绍.
本人也准备在一个项目中引入osworkflow处利流程.
期待楼主更多的大作!  回复  更多评论
  

# re: OSWorkflow 探索 2006-01-12 12:32 TODI
good  回复  更多评论
  

# re: OSWorkflow 探索 2006-01-24 20:16 刘峰
我也正在参与广州某政府部门大型电子政务开发,公司现有的工作流不能满足需要,研究OSWORKFLOW后,我也想把他引进来,确实灵活适用.  回复  更多评论
  

# re: OSWorkflow 探索 2006-01-25 09:27 Rosen
我想 JBPM 同样适合你的需求。它的流程跟踪日志和变量存储机制,我觉得更吸引人。:)  回复  更多评论
  

# re: OSWorkflow 探索 2006-05-15 16:14 zzpsmis
关于condition(条件)

关于(AND)条件能不能做到当在某一步骤需要8个人审批!但是只需要其中任何一个人审批完后流程就能往下走,不知道(AND)条件能不能满足!

麻烦指导,谢谢了!  回复  更多评论
  

# re: OSWorkflow 探索 2006-05-15 21:36 Rosen
zzpsmis 你好,我觉得 OR 更适合这种情况吧。  回复  更多评论
  

# re: OSWorkflow 探索 2006-05-16 15:44 zzpsmis
不知道对表单的控制能否做到!(在某一步骤需要对表单中的某一项进行类似权限的控制)OA项目中有很多这方面的要求!
  回复  更多评论
  

# re: OSWorkflow 探索 2006-05-16 23:40 Rosen
zzpsmis,我觉得你应该关注一下 JBPM。JBoss 已经收购了 Drools,把它作为 JEMS 体系的规则引擎部分,JBPM 同样也是 JEMS 的一部分。相信你所提到的表单、按钮的控制通过规则引擎和 JBPM 可以很好解决的。JBPM 有个不好的地方是和 Spring 集成的问题,有些贡献者已经抛出了自己的 Spring 集成实现,相信随着时间的发展 JBoss 官方会解决这个问题的。对于 OSWF,感觉他们的开发团队效率还是太低,不知道是否已经放弃 OSWF。  回复  更多评论
  

# re: OSWorkflow 探索 2006-05-17 16:00 zzpsmis
1、文档太少,少得让人抓狂。
2、最让人感觉BT 的是,drl/dsl 中,不能有逗号等标点符号,以及其keyword 如:end, druation... ,否则报错
3、condition 需要自己凭经验去优化,两种不同的写法如:
Person(sex == "male", age > 18) 和
Person(age > 18, sex == "male")

单单是换了一下属性的位置,两者的性能就会差10-20倍!

还需要努力哦!  回复  更多评论
  

# re: OSWorkflow 探索 2006-07-02 13:09 jameswww
oswf是否支持表单设计和定义呢?在那里能找到文档说明这个问题?  回复  更多评论
  

# re: OSWorkflow 探索 2006-07-02 14:29 Rosen
@jameswww
不知道“表单设计和定义”具体含义是什么,可否说明得更具体一点。
  回复  更多评论
  

# re: OSWorkflow 探索 2006-07-20 11:58 flyingchen
我有一个需求,能够让用户自定义工作流,请问osworkflow能否完成。根据您所说,似乎“OSWorkflow 不希望一个非技术用户修改工作流程”。
这是否意味流程是程序员已经确定好的,不能让用户自由定制呢?  回复  更多评论
  

# re: OSWorkflow 探索 2006-07-21 09:25 Rosen
@flyingchen
是的,这是 OSWF 官方的言论,就目前所接触到的工作流产品,基本还是由开发者来定制。如果要达到自定义的目的,可考虑实现简单“点对点流程”,就是让用户选择发出的“公文或文档”要经过哪些角色(部门、人员),并有DB记录路线。上次和 BEA 工程师交流过,他们也认同这种做法,似乎大部分的产品级工作流方案都不适合中国国情,包括国内的工作流产品。  回复  更多评论
  

# re: OSWorkflow 探索 2006-08-26 19:31 flyingchen
感谢大哥小弟以指导。
如果可以,请加小弟msn:flying_main AT hotmail.com (AT=@)
非常感谢!  回复  更多评论
  

# re: OSWorkflow 探索 2006-08-27 19:36 Rosen
@flyingchen
我都很久没用 OSWF 了。如果你想问的是如何实现“用户自由定制流程”,我想建议的是:还不如自己实现“点对点流程”。OSWF 官方文档开篇就这样说:“OSWorkflow 不希望一个非技术用户修改工作流程,虽然一些其他工作流系统提供了简单的 GUI 用于工作流编辑,但像这样改变工作流,通常会破坏这些应用。”。  回复  更多评论
  

# re: OSWorkflow 探索 2006-09-20 09:19 lambxlamb
需求:当前工作环节,可以任选几个下步处理部门,同时派给它们,后续做并发处理。用OSWorkflow如何实现?

1、OSWorkflow的result只流向第一个判断为真的分支,对吗?
2、split的后续steps是预先写死的吧,如果把各部门排列组合情况都罗列,是几何级数放大的?

000250 @ gmail . com

P.S. 根据DTD—— split (unconditional-result+)
split包括若干“无条件”的result,而不是有条件的。  回复  更多评论
  

# re: OSWorkflow 探索 2006-09-20 10:09 ava
osworkflow的代码结构
http://zstzah.blog.bokee.net/bloggermodule/blog_viewblog.do?id=116925  回复  更多评论
  

# re: OSWorkflow 探索 2007-02-02 17:39 cskys
感觉osworkflow实现或分支好像比较困难,用split+join根本不能实现,不知道用condition是否可以实现
  回复  更多评论
  

# re: OSWorkflow 探索 2007-02-03 20:03 Rosen
@cskys
的确比较困难,condition 会带来大量的条件判断。  回复  更多评论
  

# re: OSWorkflow 探索 2007-02-13 17:18 hiya
@刘峰
请教osworkflow2.8+mysql4.0.27+hibernate3.2.2连不上数据库?
chf@tsinghua.org.cn
  回复  更多评论
  

# re: OSWorkflow 探索 2007-02-27 09:32 Rosen
@hiya
建议利用 Spring 进行配置,我没有单独使用 OSWF 连接 HB。  回复  更多评论
  

# re: OSWorkflow 探索[未登录] 2007-07-25 10:45 leon
能告诉一下你的联系方式吗?  回复  更多评论
  

# re: OSWorkflow 探索 2007-11-30 00:23 plutoner
想用简单的可以看看http://www.agilestep.cn/  回复  更多评论
  

# re: OSWorkflow 探索 2007-11-30 11:02 Rosen
@plutoner
老兄是做工作流产品的?不错  回复  更多评论
  

# re: OSWorkflow 探索 2007-12-01 15:55 plutoner
是一位教授写的核心,我只是“包装”一下。
用了给点意见。  回复  更多评论
  

# re: OSWorkflow 探索 2007-12-01 21:09 Rosen
@plutoner
呵呵,很久都没研究了。我还没发现任何一款工作流产品能真正适应国情。至少评估了OSWF和Jboss的WF之后有这种感受。  回复  更多评论
  

# re: OSWorkflow 探索 2007-12-02 10:12 plutoner
是啊。
在中国搞这种系统的都是政府或国企,所以决定项目的成败不是技术而是公关。这就是“国情”。
中小型企业是软件的试金石,这些企业老板关心的是一个系统能不能帮助企业赚钱省钱,而工作流离最终实际应用还有一段距离,所以真是“路漫漫其....”


  回复  更多评论
  

# re: OSWorkflow 探索 2009-07-29 14:37 xiaoxia0617
拜托写的再详细些行不!  回复  更多评论
  

# re: OSWorkflow 探索 2009-07-31 08:18 Rosen
@xiaoxia0617
以为oswf已经没人用,官方出到2.8就停止了,我建议还是转向其他开源产品吧。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: