现在公司开发的项目中用到了工作流,在进入本公司之前本屌丝还没有接触过工作流,所以对工作流的工作原理一直很感兴趣,一直在默默的学习,终于有一天本屌突然看懂了源码(大雾,现在我觉得看懂了可能只是骗我自己,好可怕),而且今天终于有时间来整理一下工作流,以备大家指正。
本屌公司之前的CTO是阿里的大牛,所以整个公司的项目框架我们可以看出很多阿里的风格,能接触这么厉害的技术,本屌心里好开心,废话不说了,回归正题:
项目中应用Spring MVC+Maven,简单粗暴,工作流的作用呢,就是确保数据流程完整,保持状态一致正确,有倒计时功能的状态可以自动更新状态,发布事件。如果有监听事件的处理器就可以调用相关动作了。
那么工作流除了业务环境中的手动推进,今天我们主要讲的就是超时事件,当前状态可能只能保持10分钟或者配置文件中的特定时间,超过此事件状态失效,状态流转为time_out并且发布状态超时事件。我们准备讲一个实际状态,审核状态,如果审核中的状态持续了1个小时而没有人手动审核的话,超时。
第一。我们定义了业务的状态流转模型
我们可以看到等待复核状态后面有三个相应状态,标红的复核超时就是工作流推动的。
第二,把模型转换成XML配置
我们在项目中按照业务流程把需要工作流推动状态的几个模型的状态流转转换为工作流的模板定义。看XML
<wf_def>
<name>transit_task</name>
<desc>运输流程</desc>
<next_action_name>start</next_action_name>
<type_val_in_id>WF03</type_val_in_id>
<wf_action_list>
<wf_action>
<pvg_required>
<key>*</key>
<user>*</user>
</pvg_required>
<need_lock>true</need_lock>
<name>start</name>
<desc>开始</desc>
<executer_name>BLANK_ACTION</executer_name>
<next_status_list>
<next_status>
<caseExpr>*</caseExpr>
<status>in_transit</status>
</next_status>
</next_status_list>
</wf_action>
</wf_action>
<!-- <wf_action>
<pvg_required>
<key>*</key>
<user>*</user>
</pvg_required>
<need_lock>true</need_lock>
<name>jyy_arrive_proof</name>
<desc>交易员确认到货</desc>
<executer_name>BLANK_ACTION</executer_name>
<next_status_list>
<next_status>
<caseExpr>*</caseExpr>
<status>jyy_arrived</status>
</next_status>
</next_status_list>
</wf_action>
-->
</wf_action_list>
<wf_status_list>
<!-- 取消开始运输
<wf_status>
<name>wait_transit</name>
<desc>待运输</desc>
<next_action_list>
<next_action>
<name>start_transit</name>
</next_action>
</next_action_list>
<action_relation>XOR</action_relation>
<finish>false</finish>
</wf_status>
--><wf_status>
<name>force_discard</name>
<desc>强制作废</desc>
<finish>true</finish>
</wf_status>
</wf_status_list>
屌大的一眼看明白了这个XML配置的主要信息是什么了,一个是wf_status_list,一个是wf_action_list。他们的list顺序就代表状态的流转顺序,不能打乱。
第三。加载我们的工作流实例配置XML
下面这个xml配置就是启动ConfigLoader扫描我们手动配置的工作流的模板的a.b.c.xml文件(即 上面我们