在Jbpm的processInstance与taskInstance都对外提供了挂起进程实例或工作实例的的接口,同时也提供了释放的接口。分别是:
1,processinstance
      processinstance.suspend();
      processInstance.resume();
2,taskInstance
    taskInstance.suspend();
    taskInstance.resume();
        同时processinstance与 taskInstance还提供了一个标志位,isSuspended与isOpen分别表示是挂起还是开放状态,如果标志位isSuspended=true&&isOpen=fasle,那么这个进程实例或任务实例在用户界面就不会被找出来,但在管理界面还是可以看到。如果isSuspended=false&&isOpen=true,结果就是正常情况了。
以上介绍了一下Jbpm中挂起与释放的功能,但它存在一个bug,在正常情况下当你调用这两个方法时,是会出错的。提示badsql 语法错误,经过跟踪才知道原来在Jbpm的查询语句里出现了错误。在这里简单介绍一下Jbpm的数据库查询方法,Jbpm的底层持久层采用的是Hiberante3.1,但是它的查询方法却是采用了很少人会用的外置命名查询(为什么采用这个方法,采用这个方法有什么好处,我也没有对它进行研究过。^_^),问题就出在,在调用挂起与释放这两个方法时,它主要做的是以下几个操作:
    suspendTimers();
    suspendMessages();
    suspendTaskInstances();
跟踪得到在挂起messages时出现了错误,文件就出在外置命名查询的sql语句上:
    原码:
             <query name="MessagingSession.suspendMessagesForToken">
                 <![CDATA[
                                    update org.jbpm.msg.Message
                                    set isSuspended = true
                                    where token = :token
                   ]]>
             </query>
看到这里属性hibernate的人应该马上可以知道那里出了问题了,^_^!
在hibernate中条件查询一定要定义别名,如下就正常了!^_^!
            <query name="MessagingSession.suspendMessagesForToken">
                 <![CDATA[
                                   update org.jbpm.msg.Message me
                                   set me.isSuspended = true
                                   where me.token = :token
                ]]>
            </query>
总的来说Jbpm还是不错的一个工作流引擎,但是还是存在一定的局限,本人最近在研究Jbpm回退功能的实现,欢迎大家一起研究!
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jonim/archive/2006/11/03/1364208.aspx