答:下载之后,在OSWorkflow的docs目录下会有一些dtd文件。其中workflow_2_7.dtd就是2.7的工作流xml使用的dtd。在这个文件中,作者使用注释详细说明了每个元素的含义和作用。
<steps> <step name="Step1" id="1"> <actions> <action name="Step1_Action" id="11"> <results> <unconditional-result old-status="Finished" status="Waiting" step="2"/> </results> </action> </actions> </step> <step name="Step2" id="2"> ...... </step>
<steps>
|
<step name="Step2" id="2"> <actions> <action name="Step2_Action" id="21" auto="true"> <results> <unconditional-result old-status="Finished" status="Ready1" split="100"/> </results> </action> </actions>
</step>
|
进入Step2后,Step2_Action将自动执行。
<steps> ...... <step name="Step2" id="2"> <actions> <action name="Step2_Action" id="21"> <results> <unconditional-result old-status="Finished" status="Ready1" split="100"/> </results> </action> </actions> </step> <step name="Split_Step" id="31"> <actions> <action name="Split_Step_Action" id="311"> <results> <unconditional-result old-status="finished" status="Ready2" join="200"/> </results> </action> </actions> </step> <step name="Split_Step" id="32"> <actions> <action name="Split_Step_Action" id="321"> <results> <unconditional-result old-status="finished" status="Ready3" join="200"/> </results> </action> </actions> </step> <step name="Join_Step" id="4"> ...... </step> </steps> <splits> <split id="100"> <unconditional-result old-status="finished" status="Ready5" step="31" /> <unconditional-result old-status="finished" status="Ready6" step="32" /> </split> </splits> <joins> <join id="200"> <conditions> <condition type="beanshell"> <arg name="script"> "finished".equals( jn.getStep(31).getStatus()) &&"finished".equals( jn.getStep(32).getStatus()); </arg> </condition> </conditions> <unconditional-result old-status="finished" status="Ready7" step="4" /> </join> </joins> |
注意:<steps>、<splits> 和<joins>可以理解为<step>、< split>和<join>对应的集合。关键是<result>(或<unconditional- result>),使得这些离散的建立了关联,确定了状态转换的目标。
<steps> <step name="Step1" id="1"> <actions> <action name="Step1_Action1" id="11"> <results> <unconditional-result old-status="Finished" status="Waiting" step="2"/> </results> </action> <action name="Step1_Action2" id="12"> <results> <unconditional-result old-status="Finished" status="Waiting" step="3"/> </results> </action> </actions> </step> <step name="Step2" id="2"> ...... </step> <step name="Step3" id="3"> ...... </step>
<steps>
|
<step name="Step2" id="2"> <actions> <action name="Step2_Action" id="21"> <results> <result old-status="Finished" status="Ready1" step="5"> <conditions> <condition type="beanshell"> <arg name="script"> null== transientVars.get("flag"); </arg> </condition> </conditions> </result> <unconditional-result old-status="Finished" status="Ready1" split="100"/> </results> </action> </actions>
</step>
|
从OSWorkflow 的DTD中,可以知道<results>的有关资料:<!ELEMENT results (result*, unconditional-result)>。当有多个带条件的result时,满足条件的第一个<result>起作用,当没有条 件满足时< unconditional-result >起作用。
<function type="beanshell"> <arg name="script"> System.out.println("prefunction 2 of action 11"); </arg> </function> |
<function type="class"> <!-- 实现类,参见javadoc --> <arg name="class.name"> workflow.Prefunction1OfStep1 </arg> <arg name="msg">foxgem is ok!</arg> </function> |
上述对象,前三个可以使用在前面列出的所有组件中使用。最后一个主要在join中定义的conditions中使用,见前例。
<initial-actions> <action name="Start Workflow" id="1"> <results> <unconditional-result old-status="Finished" status="Queued" step="1"/> </results> </action> <action name="Another Entry" id="2"> <results> <unconditional-result old-status="Finished" status="Underway" step="2"/> </results> </action>
</initial-actions>
|
这其中的每个Action代表了不同的流程启动点。
以上就是OSWorkflow的基本使用,实际上最常用的就是2个方法:initialize和doAction。对于其他的方法和对象,请参见对应的javadoc。
答:对于持久化的支持,OSWorkflow提供了WorkflowStore接 口,可以让使用者自己实现自定义的持久化机制。对于数据库,使用 JDBCStore即可。关于JDBCStore的配置主要集中于osworkflow.xml中,具体的配置方法,参见文档:1.4 Persistence Options。
- 自定义查询:首先构造WorkflowExpressionQuery,然后使用Workflow的query。具体例子参见:文档5.4 Queries。