osworkflow介绍例子

自己刚刚涉入工作流,也看到很多人写了很多关于工作流方面的文章,有关于osworkflow的,有关于jbpm的,还有其他什么的!总是不如自己写下自己的经历比较真实一些,这样才能问清楚自己到底懂了什么,写这个blog,是为明理!

 

先说说伴随osworkflow源包里面的小例子osworkflow-2.8.0-example.war,有几点引起我的兴趣:1.跟流程进度相关的js;2.流程管理

 

这个小例子的组成包括:

1.跟osworkflow相关的配置文件,路径webapp/WEB-INF/classes。其中workflows.xml里面可以配置多个流程,分别用不同的name指定,同时指向特定的流程文件,这里的流程配置文件就是example.xml。

2.example的各个访问jsp文件之间的关系:

   一、初始化流程

       用户点击访问reference.jsp初始化工作流,看一下内部代码结构:

   UserManager um = UserManager.getInstance();
    User test = um.createUser("test");
    test.setPassword("test");

    Group foos = um.createGroup("foos");
    Group bars = um.createGroup("bars");
    Group bazs = um.createGroup("bazs");

    test.addToGroup(foos);
    test.addToGroup(bars);
    test.addToGroup(bazs);

    response.sendRedirect(request.getContextPath() + "/default.jsp");

他们创建了一个用户,并且把这个用户放在三个用户组里面,这里是他们偷懒的地方,不能够通过不同的角色进行,我们在操作这个例子的时候,有点感觉不到不同的角色的数据范围。

 

   二、test用户登录:

   在default.jsp中,提交用户登录信息,进入login.jsp,在这个页面里面处理验证等问题,然后转到nav.jsp!!(一口气啊!!)

   三、初始化工作流:

nav.jsp里面的 newworkflow.jsp:

   Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));
    long id = wf.initialize("example", 100, null);

   这里根据用户来创建和初始化name是example的工作流。

初始化完后,就要开始工作流的扭转了。

  四、工作流的扭转:

  我想在这一步,基本可以满足我们的需要了,尽管可能要做很多更深层的封装。

  对照着example.xml,我觉得应该可以看清楚各个接口之间的调用关系,用户之间的流程传递。

  工作流中要关注的几个问题(我们还没有):

   1) 不同角色的操作

   2)不同角色面向的不同数据集

   3)整个工作流的状态

   4)针对某个用户,跟他相关的工作流及其状态

 

从example.xml中的流程中分析,最开始的创建是

  <initial-actions>
        <action id="100" name="Start Workflow">
            <restrict-to>
                <conditions type="AND">
                    <condition type="beanshell">
                        <arg name="script">true</arg>
                    </condition>
                    <condition type="class">
                        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
                        <arg name="group">foos</arg>
                    </condition>
                </conditions>
            </restrict-to>
            <pre-functions>
                <function type="class">
                    <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
                </function>
            </pre-functions>
            <results>
                <unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
            </results>
        </action>
    </initial-actions>

这里的几个标签说明吧(没有完全看osworkflow里面的文档,算是摸索出来的,兄弟们如果看到有原文描述的比较好,给个链接!)

initial-actions:流程的开始初始actions;

<arg name="group">foos</arg>在这里可以限定,哪些用户(特定用户组,角色等)可以创建和初始化流程;

在此要提一下流程的状态:

A workflow status is a string that describes the status of a workflow within a particular step. In our document management system, our 'First Draft' step might have two disinct statuses, 'Underway', and 'Queued' that it cares about.

We use 'Queued' to denote that the item has been queued in the 'First Draft'. Let's say someone has requested that a particular document be written, but no author has been assigned. So the document is now currently 'Queued' in the 'First Draft' step. The 'Underway' status would be used to denote that an author has picked the document from the queue and perhaps locked it, denoting that he is now working on the first draft.

这里的这段说明,就直接抄过来了!这里说明流程中每一步存在的状态。这里举得一个例子就是他们的文档管理系统,他们的“第一份草稿”步骤可能存在两种不同的状态,“进行中”和“等待中”(即:'Underway'and 'Queued' )。

 

在这个初始化的action中,还有几点是我们关注的:function 和 result。

function是提供我们开发的时候实现具体操作的接口。我们的业务的切入点就是从实现FunctionProvider这个接口开始了。

com.opensymphony.workflow.util.Caller就是一个实现FunctionProvider的简单类,它就做了从WorkflowContext中获取调用者(caller),然后通过transientVars.put("caller", context.getCaller());将调用者放到流程中去,所以results里面可以通过${caller}来获取transientVars中的caller指定的调用者。并且指定流程流转到下一步的拥有者(这个地方还要好好研究一下,就是看能不能通过角色进行扭转,否则就要通过控制用户关联的方式!)

 

从以上几点出发,我们基本可以实现一个简单的流程,但是在这里还有很多问题要解决(包括前面说的角色相关,而不是具体用户相关),那就是如何能够与我们的业务实现对应。

而且针对我们的应用,我们还应该封装过程信息,跟过程中相关的各个参与者看到相应的过程状态。。

 

总结:

正如osworkflow开始时描述的那样,一个流程里面包括了整个流程的定义,流程中的各个步骤的定义,每个步骤中有很多actions,每个action中有限制、前置function,多个results(一定要包含一个unconditional-result),然后是后置function!

前后的关联是通过result指定。

后面关于split和join的分析,再跟上来。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值