流程定义文件:
<?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
分享到:
相关推荐
5. **状态管理(State Management)**:如果应用较复杂,可能需要使用Vuex来管理全局状态,确保树节点和子表之间的交互和数据同步。 6. **API调用(API Calls)**:与后端Controller通信,发送HTTP请求获取数据、...
SWF的工作原理基于状态机的概念,一个Web流程由一组状态(states)组成,每个状态代表流程中的一个节点,如显示一个视图或执行一个操作。状态之间通过转变(transitions)连接,转变由特定的事件(events)触发。...
在这个例子中,`increaseLevel` 和 `addItem` 是自定义的方法,用于向模型中添加新节点。`increaseLevel` 用于增加层级,`addItem` 用于在指定父节点下添加子节点,并设置它们的复选框状态和其他数据。 通过以上...
jsTree 支持多种插件来扩展其功能,如 `checkbox` 插件实现复选框选择,`contextmenu` 插件添加右键菜单,`types` 插件定义不同类型的节点样式等。例如,启用 `checkbox` 插件: ```javascript $('#jstree').jstree...
`addEndpoint`接受元素选择器或DOM元素作为参数,并可配置端点的位置、类型等。 ```javascript var node1 = document.getElementById('node1'); instance.addEndpoint(node1, { isSource: true, isTarget: true });...
主题不仅包括颜色和字体,还涉及节点的形状、图标以及各种状态(如选中、展开、禁用)下的表现形式。 #### 主题的配置和应用 1. **加载主题**:在初始化jsTree时,可以通过`theme`选项指定要使用的主题。例如: `...
2. **交互性**:用户可以通过点击、拖放、右键菜单等方式与树结构进行交互,例如选择节点、展开/折叠子节点、移动节点等。 3. **数据源灵活**:JsTree可以接受JSON、HTML或XML格式的数据,方便从服务器动态加载或...
- **5.4 状态教程,第3部分-模板,包含,扩展**(_State tutorial, part 3 - Templating, Includes, Extends_): 介绍了如何使用模板化、包含和扩展来提高状态文件的可重用性和灵活性。 - **5.5 状态教程,第4部分...
initialState: "expanded" // 初始状态,可以是"expanded"(默认展开)或"collapsed"(默认折叠) }); ``` - **设置节点关系**:每个表格行(`<tr>`)需要通过`data-parent`属性来指定其父节点的ID,以此建立树...
2. **响应式状态管理**:Strudel.js使用一种称为"state streams"的概念,这是一种声明式的机制,用于管理组件的状态变化。当状态改变时,框架会自动计算出受影响的部分并进行更新,确保UI的实时响应。 3. **模板...
BASE理论则是对ACID(原子性、一致性、隔离性、持久性)事务特性的放宽,提出在分布式系统中,应该允许系统处于soft-state(软状态)和eventually consistent(最终一致性)状态。 分布式存储系统在设计时需要考虑...
状态转换图(State Transition Diagram)用于描述系统或对象的状态变化及其响应外部事件的行为。在复印机的例子中,系统有四种状态:闲置、复印、缺纸、卡纸。每种状态都有其特定的行为,如在闲置状态下接收复印命令...
**OSPF**(Open Shortest Path First)是一种基于链路状态(Link-State)算法的内部网关协议(IGP),旨在为互联网上的自治系统提供高效且稳定的路由选择服务。根据文档的描述部分,可以看出该文档是对OSPF协议版本2...
1. **状态位置(Where is the state?)**:在分布式系统中,数据的状态可能分布在不同的节点上,因此确定数据存储的位置至关重要。 2. **一致性与可用性的权衡(Consistency vs. Availability)**:在分布式系统中,...
3. **选择推理算法**:POMDP的难点在于如何在部分可观测的情况下推断状态。常见的推理算法有信念节点(Belief Node)更新、粒子滤波(Particle Filter)、蒙特卡洛预测(Monte Carlo Prediction)等。 4. **实现策略...
在训练完成后,我们使用`tf.train.get_checkpoint_state()`获取最新的检查点,并通过`saver.restore()`恢复模型的权重。接着,我们将模型转换为常量图,这样可以避免在部署时还需要会话(Session)。`graph_util....
- `setCheckState(int column, Qt.CheckState state)`:设置指定列(column)的复选状态,如Qt.Checked或Qt.Unchecked,用于实现可勾选的节点。 - `setIcon(int column, QIcon icon)`:在指定列(column)中设置图标,...
- **CART**(Classification and Regression Trees):不仅可以用于分类任务,也可用于回归任务,采用基尼不纯度作为划分标准。 ### 4. Python实现 在Python中,常用的决策树库是`scikit-learn`,其提供了`...