`

十四、从起点(StartState)出发,如何得知下一步可选的路径列表

 
阅读更多

<process-definition  name="test3">
   <start-state name="开始">

      <!-- 流转条件,从ContextInstance中取days变量 -->
      <transition name="流向李四审批" to="李四审批" condition="#{days gt 10}"></transition>
      <transition name="流向王五审批" to="王五审批" condition="#{days le 10}"></transition>

   </start-state>
   <task-node name="李四审批">
         <task name="审批">
             <assignment actor-id="李四"></assignment>
         </task>
      <transition name="" to="结束"></transition>
   </task-node>
   <task-node name="王五审批">
      <task name="审批">
             <assignment actor-id="王五"></assignment>
         </task>
      <transition name="" to="结束"></transition>
   </task-node>
   <end-state name="结束"></end-state>
</process-definition>

 

 

    //创建公文
    @Test
    public void createDocTest(){
       
        JbpmContext context = null;
       
         try {
             
            //默认从classpath中查找名为hibernate.cfg.xml的配置文件
            JbpmConfiguration configuration = JbpmConfiguration.getInstance();
           
            //JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化功能
            context = configuration.createJbpmContext();
           
            Document document = new Document();
            document.setTitle("公文"+new Random().nextInt());
           
            context.getSession().save(document);
           
            //创建流程实例
            //1、首先从数据库中加载ProcessDefinition对象
            ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition("test3");
            //2、根据ProcessDefinition对象,创建流程实例对象
            ProcessInstance instance = new ProcessInstance(definition);
            instance.setKey(document.getId()+"");
            context.save(instance);
            //3、把公文对象和流程实例对象互相绑定
            System.out.println("流程实例ID:"+instance.getId());
            System.out.println("公文ID:"+document.getId());
            document.setProcessInstanceId(instance.getId());
            instance.getContextInstance().setVariable("documentId", document.getId());
            //为流转条件赋值
            instance.getContextInstance().setVariable("days", 5);

        } catch (RuntimeException e) {
            e.printStackTrace();
            //回滚
            context.setRollbackOnly();
        }finally{
            context.close();
        }
       
    }

 

//查询开始节点的下一个流转方向
    @SuppressWarnings("unchecked")
    @Test
    public void searchNextTransitionsFromStartStateTest(){
       
        JbpmContext context = null;
       
         try {
             
            //默认从classpath中查找名为hibernate.cfg.xml的配置文件
            JbpmConfiguration configuration = JbpmConfiguration.getInstance();
           
            //JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化功能
            context = configuration.createJbpmContext();
           
            //已知公文Id=5
            Document document = (Document) context.getSession().load(Document.class, 5l);
            //得到公文对应的流程实例
            long processInstanceId = document.getProcessInstanceId();
            ProcessInstance instance = context.getProcessInstance(processInstanceId);
            //当遇到流转是有条件的时候,该方法不合适
            //List<Transition> list = instance.getRootToken().getNode().getLeavingTransitions();
            Set<Transition> list = instance.getRootToken().getAvailableTransitions();

            System.out.println("当前节点可以选择的流转方向有:");
            for (Transition transition : list) {
                System.out.println(transition.getName());
            }
           
        } catch (RuntimeException e) {
            e.printStackTrace();
        }finally{
            context.close();
        }
       
    }

 

 

 

public void submitDocTest(){
       
        JbpmContext context = null;
       
         try {
             
            //默认从classpath中查找名为hibernate.cfg.xml的配置文件
            JbpmConfiguration configuration = JbpmConfiguration.getInstance();
           
            //JbpmContext是对hibernate session的封装,提供了对JBPM相关对象的持久化功能
            context = configuration.createJbpmContext();
           
            //已知公文Id=6
            Document document = (Document) context.getSession().load(Document.class, 6l);
            //得到公文对应的流程实例
            long processInstanceId = document.getProcessInstanceId();
            ProcessInstance instance = context.getProcessInstance(processInstanceId);
           
            /*将公文提交到下一个环节,只有在流程处于开始节点的时候使用,
            当流程流转到某个任务节点时,不能使用该方法,因为使用该法只
            能使流程流转到下一个节点,而不能保证该任务节点的任务已经完成,
            使任务处于关闭状态*/
            //无参数的signal()方法只能随机选择一个流转,当流转有条件时,就会出现冲突,提交失败
            //可能会抛出org.jbpm.JbpmException: transition condition #{days gt 10} evaluated to 'false'
            instance.signal("流向王五审批");//对于一个公文只能执行一次

           
        } catch (RuntimeException e) {
            e.printStackTrace();
            //回滚
            context.setRollbackOnly();
        }finally{
            context.close();
        }
       
    }

分享到:
评论

相关推荐

    A-start路径搜索

    A-start路径搜索

    A_start路径

    可以用A*算法实现路径搜索,基于GUI的。

    利用RRT*完成迷宫环境下的最优路径规划

    路径规划也称为运动规划,是自主机器人的一项重要任务。它的目标是找到起点和目标位置之间的最短或至少最优路径。...起点和终点坐标分别为:q_start=[206, 198]; q_goal=[416, 612]。选用RRT*方法来规划路径

    Python实现迪杰斯特拉算法并生成最短路径的示例代码

    def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(Start Dijstra Path……) path=[]#s-d的最短路径 n=len(network)#邻接矩阵维度,即节点个数 fmax=999 w=[[0 for i in ...

    c++路径 c路径 c++路径 c路径

    DownloadBase start DownloadBase m_bResueThread = 0, m_hThread = 0 CHttpDownload Run before OpenInternetSession m_hInetSession : 0 after OpenInternetSession m_hInetSession : 13369352 before ...

    mysql安装到最后一步startservice错误解决方法.pdf

    到控制面板里面先把mysql删除. 到c盘C:\Program Files目录下把mysql目录删除. 如果在其他盘还有设置目录也要删除.空目录也要删除 到regedit把注册表 ,全部删除!

    python 实现不同路径

    # 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ) # 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”) # 问总共有多少条不同的路径? # ...

    【LeetCode】62. 不同路径

    官方链接 ...从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -&gt; 向右 -&gt; 向下 2. 向右 -&gt; 向下 -&gt; 向右 3. 向下 -&gt; 向右 -&gt; 向右 示例 2: 输入: m = 7, n = 3 输出: 28 提示: 1 &lt;= m,

    (来点有用的)含障碍的两点最短路径算法完整代码

    含有各种障碍物的,水平面两点间最短的距离算法。就相当于计算你从一个地方走到另一个地方,最短的路径。 注意:不是图论!不是节点!不是Dijkstra!不是Floyd!

    mysql_安装到最后一步时,start_service_为失败状态

    经常有些同学安装到最后一步时,出现服务器未打开的错误,希望这个可以帮助到TA

    WINXP默认服务恢复

    @echo Restore The Service Start State Saved At 9:20:27.79 2005-09-03 星期六 @pause sc config Alerter start= DISABLED sc config ALG start= DEMAND sc config AppMgmt start= DEMAND sc config AudioSrv...

    startcenter自动刷新功能

    maximo里的startcenter自动刷新功能

    python 实现不同路径 II

    那么从左上角到右下角将会有多少条不同的路径? # 网格中的障碍物和空位置分别用 1 和 0 来表示 # 说明:m 和 n 的值均不超过 100 # 示例 1: # 输入: # [ # [0,0,0], # [0,1,0], # [0,0,0] # ] # 输出: 2

    k-最短路径

    一个基于MATLAB的K-最短路径算法,能够最大程度的在第k次找到行进的最短路径

    基于CBS算法多AGV路径规划仿真系统源码+项目开发说明.zip

    删除小车功能,设定小车颜色(可选),加入预设的特殊布局地图、计时功能。 ### V1.2 删除小车功能完成 #### 问题记录 ![image-20201119153155889](C:\Users\AA\AppData\Roaming\Typora\typora-user-images\...

    LeetCode刷题——62. 不同路径

    从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -&gt; 向右 -&gt; 向下 2. 向右 -&gt; 向下 -&gt; 向右 3. 向下 -&gt; 向右 -&gt; 向右 示例 2: 输入: m = 7, n = 3 输出: 28 提示: 1 &lt;= m, n &lt;

    数据结构迷宫问题代码.pdf

    我们的目标是找到从起点(start)到终点(end)的路径。 这是使用Python实现的代码:见附件 注意,这个代码假设了起点的位置一定是可达的,并且迷宫中一定有可行的路径从起点到终点。如果这些假设不成立,那么你可能需要...

    weblogic集群部署文档.docx

    4、点击“下一步”,到下图界面,会因为我们没有填写上图的的支持信息而弹出两个警告框,直接“YES”通过即可。进入下图,勾选下面的框(不需要使用验证) 5、然后点击“继续”。到下图界面,选择“典型”和“定制...

    mysql 安装到最后一步时,start service 为失败状态.docx

    mysql 安装到最后一步时,start service 为失败状态.docx

    无人驾驶汽车系统入门——最短路径搜索之A*算法

    最短路径搜索是通过算法找到一张图从起点(start)到终点(goal)之间的最短路径(path),为了简化,我们这里使用方格图(该图可以简单地用二维数组来表示),如下动图所示,其中代表起点,代表终点。广度优先算法...

Global site tag (gtag.js) - Google Analytics