`

可选择的状态节点state例子

阅读更多

流程定义文件:

<?xml version="1.0" encoding="UTF-8"?>

<process key="forever" name="StateChoice" xmlns="http://jbpm.org/4.3/jpdl">
   <start g="137,74,48,48" name="start1">
      <transition g="-125,-17" name="to wait for response" to="wait for response"/>
   </start>
   <state g="85,219,157,52" name="wait for response">
      <transition g="-56,-14" name="accept" to="submit document"/>
      <transition g="9,-6" name="reject" to="try again"/>
   </state>
   <state g="26,400,121,52" name="submit document">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <state g="185,394,126,52" name="try again">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <end name="end1" g="145,508,48,48"/>
   
</process>

 图:

 

 测试类StateChoice:

 

package org.forever.jbpm;

import java.util.List;
import java.util.UUID;

import org.jbpm.api.Configuration;
import org.jbpm.api.Deployment;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class StateChoice {

	ProcessEngine processEngine = null;
	RepositoryService repositoryService = null;
	ExecutionService executionService = null;
	TaskService taskService = null;
	HistoryService historyService = null;
	ManagementService managementService = null;
	String pid = null;

	@Before
	public void initialize() {
		// 1.获取所有的服务
		processEngine = new Configuration().buildProcessEngine();
		repositoryService = processEngine.getRepositoryService();
		executionService = processEngine.getExecutionService();
		taskService = processEngine.getTaskService();
		historyService = processEngine.getHistoryService();
		managementService = processEngine.getManagementService();
	}

	@Test
	// 部署流程
	public void testDeploy() {
		// 2.部署流程,获取流程定义id(格式:key-version)
		String deployId = repositoryService.createDeployment()
				.addResourceFromClasspath(
						"org/forever/jbpm/jpdl/StateChoice.jpdl.xml").deploy();
		System.out.println("流程定义id:" + deployId);
	}

	// 启动流程实例
	@Test
	public void testStart() {
		// 3.启动流程实例,绑定业务key,key最好是唯一的
		// starts a new process instance in the latest version of the given
		// process definition
		UUID uuid = UUID.randomUUID();
		ProcessInstance processInstance = executionService
				.startProcessInstanceByKey("forever", uuid.toString());
		pid = processInstance.getId();
		System.out.println(pid);
	}

	// 获取流程实例
	public ProcessInstance getProcessInstance() {
		//对于用户给的key一般是某种唯一的key,可以这样设计,给每个表的数据生成一个uuid作为唯一标识
		//获取指定的流程实例
		ProcessInstance processInstance = executionService
				.createProcessInstanceQuery().processInstanceKey("8d0e225c-d9b6-488f-abe3-c899ea59c864")
				.uniqueResult();
		Assert.assertNotNull(processInstance);
		System.out.println(processInstance.getId());
		System.out.println(processInstance.getName());
		System.out.println(processInstance.getKey());
		System.out.println(processInstance.getPriority());
		System.out.println(processInstance.getState());
		
		return processInstance;
	
	
	}

	//让流程实例向下流转
	@Test
	public void testSignal() {
		ProcessInstance processInstance = getProcessInstance();
		Assert.assertNotNull(processInstance);
		//根据具体的业务进行流转
		 processInstance = executionService.signalExecutionById(processInstance.getId(),"accept"); 
	}
	
	//让流程实例继续向下流转
	@Test
	public void testSignalNext() {
		ProcessInstance processInstance = getProcessInstance();
		Assert.assertNotNull(processInstance);
		//根据具体的业务进行流转
		//当流程实例的任务完成之后,数据库会自动删除该实例
		 processInstance = executionService.signalExecutionById(processInstance.getId());
		 getProcessInstance();
	}
	
	//删除流程实例
	@Test
	public void testDelDeployment(){
		List<Deployment> deployments = repositoryService.createDeploymentQuery().list();
		for (Deployment deployment : deployments) {
			System.out.println(deployment.getId());
			//侧地删除与之相关的内容
			repositoryService.deleteDeploymentCascade(deployment.getId());
		}
	}

	//从头执行到尾
	public void main(String[] args) {

		// 1.获取所有的服务
		ProcessEngine processEngine = new Configuration().buildProcessEngine();
		RepositoryService repositoryService = processEngine
				.getRepositoryService();
		ExecutionService executionService = processEngine.getExecutionService();
		// TaskService taskService = processEngine.getTaskService();
		// HistoryService historyService = processEngine.getHistoryService();
		// ManagementService managementService =
		// processEngine.getManagementService();

		// 2.部署流程,获取流程定义id(格式:key-version)
		String deployId = repositoryService.createDeployment()
				.addResourceFromClasspath("StateChoice.jpdl.xml").deploy();

		System.out.println("流程定义id:" + deployId);

		// 3.启动流程实例,绑定业务key
		// starts a new process instance in the latest version of the given
		// process definition
		UUID uuid = UUID.randomUUID();
		ProcessInstance processInstance = executionService
				.startProcessInstanceByKey("forever", uuid.toString());
		//String pid = processInstance.getId();// 获取绑定的key
		// 流向到达了wait for response,等待状态
		System.out.println(processInstance.isActive("wait for response"));
		// 触发到下一个分支状态
		String executionId = processInstance.findActiveExecutionIn(
				"wait for response").getId();
		System.out.println(executionId);
		// 向指定的名字外向转移
		processInstance = executionService.signalExecutionById(executionId,
				"accept");
		System.out.println(processInstance.isActive("submit document"));
		System.out.println("是否结束:" + processInstance.isEnded());
		processInstance = executionService.signalExecutionById(processInstance
				.findActiveExecutionIn("submit document").getId());
		System.out.println("是否结束:" + processInstance.isEnded());
		// 删除流程实例
		repositoryService.deleteDeploymentCascade(deployId);
	}
}

 

 

  • 大小: 11.3 KB
0
0
分享到:
评论

相关推荐

    Vue代码示例,左边Tree,右边对Tree节点配置子表多条数据

    5. **状态管理(State Management)**:如果应用较复杂,可能需要使用Vuex来管理全局状态,确保树节点和子表之间的交互和数据同步。 6. **API调用(API Calls)**:与后端Controller通信,发送HTTP请求获取数据、...

    SPRING WEB-FLOW入门教程

    SWF的工作原理基于状态机的概念,一个Web流程由一组状态(states)组成,每个状态代表流程中的一个节点,如显示一个视图或执行一个操作。状态之间通过转变(transitions)连接,转变由特定的事件(events)触发。...

    pyqt treemodel使用checkbox例子代码

    在这个例子中,`increaseLevel` 和 `addItem` 是自定义的方法,用于向模型中添加新节点。`increaseLevel` 用于增加层级,`addItem` 用于在指定父节点下添加子节点,并设置它们的复选框状态和其他数据。 通过以上...

    jsTree JAVA例子

    jsTree 支持多种插件来扩展其功能,如 `checkbox` 插件实现复选框选择,`contextmenu` 插件添加右键菜单,`types` 插件定义不同类型的节点样式等。例如,启用 `checkbox` 插件: ```javascript $('#jstree').jstree...

    jsPlumb完整实例

    `addEndpoint`接受元素选择器或DOM元素作为参数,并可配置端点的位置、类型等。 ```javascript var node1 = document.getElementById('node1'); instance.addEndpoint(node1, { isSource: true, isTarget: true });...

    jsTree例子2-theme-plugin

    主题不仅包括颜色和字体,还涉及节点的形状、图标以及各种状态(如选中、展开、禁用)下的表现形式。 #### 主题的配置和应用 1. **加载主题**:在初始化jsTree时,可以通过`theme`选项指定要使用的主题。例如: `...

    GMF开发FSM的完整的例子

    在FSM的例子中,这个模型可能包含“State”、“Transition”等元素。 2. **Domain GenModel**:基于领域模型生成的代码,这部分代码描述了模型的结构,为后续的处理提供基础。 3. **Graphical Definition Model...

    bootstrap-JsTree简单dome

    2. **交互性**:用户可以通过点击、拖放、右键菜单等方式与树结构进行交互,例如选择节点、展开/折叠子节点、移动节点等。 3. **数据源灵活**:JsTree可以接受JSON、HTML或XML格式的数据,方便从服务器动态加载或...

    Salt-2016.11.1.pdf

    - **5.4 状态教程,第3部分-模板,包含,扩展**(_State tutorial, part 3 - Templating, Includes, Extends_): 介绍了如何使用模板化、包含和扩展来提高状态文件的可重用性和灵活性。 - **5.5 状态教程,第4部分...

    jquery treetable

    initialState: "expanded" // 初始状态,可以是"expanded"(默认展开)或"collapsed"(默认折叠) }); ``` - **设置节点关系**:每个表格行(`&lt;tr&gt;`)需要通过`data-parent`属性来指定其父节点的ID,以此建立树...

    Strudeljs一个轻量级的ECMAScript2015组件框架

    2. **响应式状态管理**:Strudel.js使用一种称为"state streams"的概念,这是一种声明式的机制,用于管理组件的状态变化。当状态改变时,框架会自动计算出受影响的部分并进行更新,确保UI的实时响应。 3. **模板...

    分布式存储架构实践

    BASE理论则是对ACID(原子性、一致性、隔离性、持久性)事务特性的放宽,提出在分布式系统中,应该允许系统处于soft-state(软状态)和eventually consistent(最终一致性)状态。 分布式存储系统在设计时需要考虑...

    软件工程考试题目

    状态转换图(State Transition Diagram)用于描述系统或对象的状态变化及其响应外部事件的行为。在复印机的例子中,系统有四种状态:闲置、复印、缺纸、卡纸。每种状态都有其特定的行为,如在闲置状态下接收复印命令...

    OSPF协议RFC2328 中文版

    **OSPF**(Open Shortest Path First)是一种基于链路状态(Link-State)算法的内部网关协议(IGP),旨在为互联网上的自治系统提供高效且稳定的路由选择服务。根据文档的描述部分,可以看出该文档是对OSPF协议版本2...

    分布式系统CAP理论模型

    1. **状态位置(Where is the state?)**:在分布式系统中,数据的状态可能分布在不同的节点上,因此确定数据存储的位置至关重要。 2. **一致性与可用性的权衡(Consistency vs. Availability)**:在分布式系统中,...

    POMDP:基于部分可观察的马尔可夫决策过程实现RL算法

    3. **选择推理算法**:POMDP的难点在于如何在部分可观测的情况下推断状态。常见的推理算法有信念节点(Belief Node)更新、粒子滤波(Particle Filter)、蒙特卡洛预测(Monte Carlo Prediction)等。 4. **实现策略...

    tensorflow 保存模型和取出中间权重例子

    在训练完成后,我们使用`tf.train.get_checkpoint_state()`获取最新的检查点,并通过`saver.restore()`恢复模型的权重。接着,我们将模型转换为常量图,这样可以避免在部署时还需要会话(Session)。`graph_util....

    python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例

    - `setCheckState(int column, Qt.CheckState state)`:设置指定列(column)的复选状态,如Qt.Checked或Qt.Unchecked,用于实现可勾选的节点。 - `setIcon(int column, QIcon icon)`:在指定列(column)中设置图标,...

    决策树,决策树算法,Python源码.zip

    - **CART**(Classification and Regression Trees):不仅可以用于分类任务,也可用于回归任务,采用基尼不纯度作为划分标准。 ### 4. Python实现 在Python中,常用的决策树库是`scikit-learn`,其提供了`...

Global site tag (gtag.js) - Google Analytics