`

十四、从起点(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*(A-star)路径搜索算法是一种在图形中寻找从起点到终点最短路径的启发式搜索算法。它结合了Dijkstra算法的最优性保证和Greedy最佳优先搜索的效率,通过评估节点的启发式函数来指导搜索方向,从而更快地找到目标。...

    A_start路径

    A*(A-Star)算法是一种在图形搜索中寻找从起点到终点最短路径的有效方法。它结合了Dijkstra算法的全局最优性和 Greedy Best-First Search的局部优先性,通过引入启发式函数来提高搜索效率。在本项目中,A*算法被...

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

    5. **Pruning Algorithms**:这些算法会从起点开始生成所有可能的路径,然后逐步删除那些不可行或者更长的分支,直到找到最短路径。 为了实现这个算法,首先需要加载`MAP.mat`数据,解析其中的障碍物信息。然后,...

    路径规划.zip

    2. **路径搜索**:运用astart.m中的A*算法寻找从起点到目标点的最优路径。 3. **路径评估**:使用distanceCost.m计算路径成本,确保路径不仅避开障碍,还尽可能短。 4. **路径可行性检查**:调用feasiblePoint.m验证...

    linux下,san存储多路径软件的安装及配置

    Linux 下 SAN 存储多路径软件的安装及配置 Linux 下 SAN 存储多路径软件的安装及配置是指在 Linux 操作系统中安装和配置 SAN 存储多路径软件的过程。这类软件可以将多个物理路径聚合成一个逻辑路径,从而提高存储...

    粒子系统按路径点移动

    - 计算从路径起点到指定路径点累积的距离。 - 该距离用于确定粒子应该位于哪两个路径点之间。 #### 四、扩展思考 1. **性能优化** - 使用更高效的算法来减少每帧的计算量。 - 减少对 ParticleSystem 组件的...

    A*路径算法python实现

    A*路径搜索算法是一种在图形或网格中寻找最短路径的有效方法,广泛应用于游戏开发、地图导航、机器人路径规划等领域。Python作为一种通用且易读的编程语言,是实现A*算法的理想选择。以下是对A*算法及其Python实现的...

    android 根据指定路径获取本地视频列表显示,点击缩略图调用系统播放器进行播放

    在Android开发中,有时我们需要实现一个功能,即根据指定的本地路径展示视频列表,并能点击缩略图播放视频。这个功能对于许多应用,如视频管理器或者个人相册应用,都是至关重要的。以下是对这个标题和描述所涉及...

    用栈的方式实现迷宫的路径求解

    - 从当前位置出发,依次尝试向上、下、左、右四个方向移动。 - 如果新位置为有效路径(未被访问过且不是障碍物),则将其坐标、步数及方向入栈,并更新当前位置。 - 如果新位置为终点,则表示找到了一条可行路径...

    利用lingo软件求最短路径

    题目描述的"求V1到V11的最短路径",意味着我们需要找到从起点V1到终点V11经过最少成本或时间的路径。这个问题可以使用Dijkstra算法或Floyd-Warshall算法等经典算法来解决,但在LINGO中,我们将采用线性规划的方法。 ...

    活动图关键路径1

    2. **计算最早开始时间(ES)和最早结束时间(EF)**:从起点(START)开始,按照活动的逻辑顺序,分配最早的开始时间。对于汇聚点(即多个活动汇合的节点),取所有分支中最早开始时间的最大值作为汇聚点后面活动的...

    LINUX下多路径(multi-path)介绍及使用

    ### LINUX下多路径(multi-path)介绍及使用 #### 一、什么是多路径? 传统的计算机系统通常采用一对一的硬盘连接方式,即一个硬盘通过单一的总线与主机相连。但在现代数据中心环境中,如通过光纤组成的存储区域网络...

    单元最短路经 Dijkstra算法 可输出路径

    它通过维护一个优先队列(通常使用二叉堆实现),逐步地找到从起点到每个顶点的最短路径。算法的核心在于每次从未访问过的顶点中选取具有最短路径估计的顶点,并更新与其相邻的顶点的路径。一旦到达目标顶点,算法...

    基于人工势场的路径规划

    机器人在这些场的作用下寻找一条从起点到目标的最短路径,这个路径既尽可能短又避免碰撞障碍物。 在MATLAB环境中,我们可以使用二维数组来表示地图,并用不同的值标记障碍物和空地。`astart.m`可能包含以下关键步骤...

    基于A*算法的路径规划

    1. **初始化**: 设置初始节点(通常是起点),将其`f(n)`值设为`h(start)`,并将其添加到开放列表中。 2. **选择节点**: 从开放列表中选择`f(n)`值最小的节点,作为当前节点。 3. **扩展节点**: 对当前节点的每个未...

    最短路径源代码

    3. **终止条件**:当找到的顶点仍为起点时,说明所有顶点的最短路径都已确定,此时可退出循环。 ### 结语 通过对上述源代码的分析,我们可以看到MFC环境下实现最短路径算法的具体技术细节,包括数据结构的选择、...

    最短路径算法实现 k-shortest-paths

    基本思路是,从起点开始,每次找到一条新路径后,将上一条路径的终点作为新的起点,继续寻找下一条路径,直到找到k条不同的最短路径。此过程中,为了避免循环路径,会使用“k个回路检测”技术。 5. Johnson算法:...

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

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

    基于A*算法的机器人路径规划的MATLAB实现

    在机器人路径规划领域,A*算法能够帮助机器人找到从起点到终点的最短路径,同时考虑到障碍物和其他环境因素。MATLAB作为一种强大的数值计算和可视化工具,被广泛用于各种算法的实现,包括路径规划算法。 A*算法的...

    有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。

    给定一个起点S和一个终点T,目标是从起点S出发到达终点T,每一步只能向上、下、左、右移动一格,并且不能穿过障碍物。需要求解的是从起点到终点的最短步数。 #### 1.2 输入格式 输入包括两部分:首先是一行包含起点...

Global site tag (gtag.js) - Google Analytics