`
antivir
  • 浏览: 94984 次
  • 来自: ...
社区版块
存档分类
最新评论

exception-handler

    博客分类:
  • jbpm
阅读更多

exception-handler 异常处理 

jbpm异常可以定义相应的处理类exception-handler

exception-handler有可见域,流程(process-instance内定义的exception-handler在整个流程内的每个节点可见)

在节点内定义的exception-handler的作用于在节点内部,会覆盖全局的exception-handler的作用域

jbpm异常主要是执行绑定到节点上的action或其他操作(委托类)时抛出的,流程流转控制本身一般不会出问题

可以为每种类型的异常定义异常处理列表

 

注意,Jbpm的异常处理机制与java异常处理不完全相似。在java中,一个捕获的异常可以影响控制流,而在Jbpm中,流程不会被Jbpm异常处理机制所改变。异常要么被捕获,要么不捕获,没有被捕获的异常被抛向客户端(例如客户端调用token.signal()),而被捕获的异常则是通过Jbpm的exception-handler,对于被捕获的异常,图执行仍会继续,就像没有异常发生一样。 在处理异常的动作中,可以使用Token.setNode(Node node)把令牌放入图中的任何节点。
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.1" name="test">
<!—这里的exception-handler对整个processInstance起作用-->
<exception-handler>
<action class="gj.action.ProcessException"/>
</exception-handler>
<start-state name="start">
<transition name="to state" to="state1"></transition>
</start-state>
<state name="state1">
<event type="node-leave">
<action name="enter node action" class="gj.action.EnterStateNodeAction"></action>
</event>
<transition name="to end" to="end1">
<action name="action1" class="gj.action.ProcessStateAction"></action>
</transition>
</state>
<end-state name="end1"></end-state>
</process-definition>
ProcessException类的代码如下:
package gj.action;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
public class ProcessException implements ActionHandler{
public void execute(ExecutionContext executionContext) throws Exception {
String errorMsg=executionContext.getException().getMessage();
System.out.println("异常类型"+executionContext.getException().toString()+" 异常消息:"+errorMsg);
}
}
这个类就可以用来处理整个ProcessInstance中发生的异常。其它在各种类型node里和在transition里定义的exception-handler的处理方式类似,只不过其作用范围仅限制为当前的node或transition。
小结
看到这里,我们已经对JPDL的流程定义语言有了较深的理解,接下来我们可以自己动手写一些流程定义的文件,以此加深对JPDL的理解。我们来看一下下面的流程定义文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="" name="test">
<!—定义一个开始结点,名为start,指向fork1-->
<start-state name="start">
<transition name="" to="fork1"></transition>
</start-state>
<!—在fork1分支结点上,我们定义了两个走向(transition)tr1和tr2,其中tr1指向top-state节点,tr2指向一个process-state,当token到达for1时会自动形成两个child token,沿着tr1和tr2的指向继续向执行-->
<fork name="fork1">
<transition name="tr1" to="top-state"></transition>
<transition name="tr2" to="test-sub-process"></transition>
</fork>
<!—top-state是一个state类型的节点,也就是前面提到的手工节点-->
<state name="top-state">
<transition name="to test-task" to="test-task"></transition>
</state>
<!—test-task是一个task-node类型的节点,它可以有多个task节点,生成我们的taskInstance,这里我们定义了三个节点-->
<task-node name="test-task" signal="first">
<task name="task-a"></task>
<task name="task-b"></task>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics