排他网关,并行网管,包含网关,事件网关

网关用来控制流程的流向 网关可以消费也可以生成token。

网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。

 

基本分支

首先 利用 流程变量  写个带有分支的一个基本流程

流程图:


部署流程文件
 

//获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    @Test
    public void deployFlow(){
        
        //获取仓库服务对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        
        InputStream in = this.getClass().getResourceAsStream("/MyProcess11.zip");
        ZipInputStream zipInputStream = new ZipInputStream(in);
        
        Deployment dm = repositoryService.createDeployment()
                                            .name("学生请假")
                                            .addZipInputStream(zipInputStream)
                                            .deploy();
        
        System.out.println("id:"+dm.getId()+",name:"+dm.getName());
    }

启动流程 并 设置请假天数为 3天的 流程变量 提交 

* 启动流程 并完成 提交
	 */
	@Test
	public void startProcessAndComp(){
		
		RuntimeService runtimeService = processEngine.getRuntimeService();
		ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
		
		System.out.println("id:"+pi.getId()+",流程实例ID:"+pi.getProcessInstanceId()+",流程定义ID:"+pi.getProcessDefinitionId());
		
		TaskService taskService = processEngine.getTaskService();
		
		//通过流程实例ID获取任务对象
		Task task = taskService.createTaskQuery()
							.processInstanceId(pi.getProcessInstanceId())
							.singleResult();
		System.out.println("taskID:"+task.getId()+",name:"+task.getName());
		
		Map<String, Object> paramMap = new HashMap<String, Object>();
		//设置流程变量day=3
		paramMap.put("day", 3);
		//提交任务的时候传入流程变量
		taskService.complete(task.getId(), paramMap);
		
		//查询任务
		task = taskService.createTaskQuery()
				.processInstanceId(pi.getProcessInstanceId())
				.singleResult();
		
		//如果任务对象为空,则流程执行结束
		if (task != null) {
			System.out.println("taskID:"+task.getId()+",name:"+task.getName());
		} else {
			System.out.println("任务执行完毕");
		}
	}

最后的运行结果:

id:1501,流程实例ID:1501,流程定义ID:leave:2:1404
taskID:1504,name:班主任
任务执行完毕

我们再部署一个 流程文件 , 并且在提交 任务的时候 设置流程变量 请假天数为 10天

 

最后的运行结果

id:1701,流程实例ID:1701,流程定义ID:leave:3:1604
taskID:1704,name:班主任
taskID:1707,name:年级主任

 

现在 流程就到了另外 一条线

 

年纪主任审批通过:

    /**
     * 提交任务
     */
    @Test
    public void completeTask(){
        TaskService taskService = processEngine.getTaskService();
        taskService.complete("1707");
    }

流程执行结束
                                                                                                                                                                                                                                                                    

排他网关:

排他网关描述
排他网关(也叫异或(XOR)网关,或更技术性的叫法 基于数据的排他网关), 用来在流程中实现决策。 当流程执行到这个网关,所有外出顺序流都会被处理一遍。 其中条件解析为true的顺序流(或者没有设置条件,概念上在顺序流上定义了一个'true') 会被选中,让流程继续运行。

注意这里的外出顺序流 与BPMN 2.0通常的概念是不同的。通常情况下,所有条件结果为true的顺序流 都会被选中,以并行方式执行,但排他网关只会选择一条顺序流执行。 就是说,虽然多个顺序流的条件结果为true, 那么XML中的第一个顺序流(也只有这一条)会被选中,并用来继续运行流程。 如果没有选中任何顺序流,会抛出一个异常。


排他网关图形
排他网关显示成一个普通网关(比如,菱形图形), 内部是一个“X”图标,表示异或(XOR)语义。 注意,没有内部图标的网关,默认为排他网关。 BPMN 2.0规范不允许在同一个流程定义中同时使用没有X和有X的菱形图形。

 

 

排他网关有个默认的选项  default flow ,  当 default flow 设定后  就不用设置表达式了,  如果所有的条件都不通过 就会执行默认的流程

年级主任审批和校长审批

首先 还是 先把文件部署 

//获取流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	@Test
	public void deployFlow2(){
		
		//获取仓库服务对象
		RepositoryService repositoryService = processEngine.getRepositoryService();
		
		InputStream in = this.getClass().getResourceAsStream("/exclusiveGateway.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
		
		Deployment dm = repositoryService.createDeployment()
											.name("学生请假")
											.addZipInputStream(zipInputStream)
											.deploy();
		
		System.out.println("id:"+dm.getId()+",name:"+dm.getName());
	}

启动流程, 并提交 设置 请假天数 为 10天   结果

  1. id:2001,流程实例ID:2001,流程定义ID:exclusiveGateWay:1:1904

  2. taskID:2004,name:学生请假

  3. taskID:2008,name:年级主任审批

再 重新部署一个流程文件 然后启动 提交  设置请假天数为 30天 执行结果

id:2201,name:学生请假
id:2301,流程实例ID:2301,流程定义ID:exclusiveGateWay:2:2204
taskID:2304,name:学生请假
taskID:2308,name:校长审批
最后在 部署一遍, 这次设置请假天数为 3天  结果
id:2501,name:学生请假
id:2601,流程实例ID:2601,流程定义ID:exclusiveGateWay:3:2504
taskID:2604,name:学生请假
taskID:2608,name:班主任审批

这里 流程走到了 当初 默认的设置  班主任审批

当我们设置了 默认 的 配置  ,即使没有 设置表达式  流程 条件都 不满足的时候  都会执行默认的


并行网关

并行网关描述
网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。 of execution.

并行网关的功能是基于进入和外出的顺序流的:

分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

并行网关图形
并行网关显示成一个普通网关(菱形)内部是一个“加号”图标, 表示“与(AND)”语义。

首先 画一个简单的并行流程

注意  并行 网关 要有2个  一个是用于 分支  一个用于 聚合

部署启动

@Test
	public void deployFlow3() {
 
		// 获取仓库服务对象
		RepositoryService repositoryService = processEngine
				.getRepositoryService();
 
		InputStream in = this.getClass().getResourceAsStream("/Parallel.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
 
		Deployment dm = repositoryService.createDeployment().name("并行网关")
				.addZipInputStream(zipInputStream).deploy();
 
		System.out.println("id:" + dm.getId() + ",name:" + dm.getName());
 
		RuntimeService runtimeService = processEngine.getRuntimeService();
		ProcessInstance pi = runtimeService
				.startProcessInstanceByKey("parallel");
 
		System.out.println("id:" + pi.getId() + ",流程实例ID:"
				+ pi.getProcessInstanceId() + ",流程定义ID:"
				+ pi.getProcessDefinitionId());
 
	}
id:2801,name:并行网关
id:2901,流程实例ID:2901,流程定义ID:parallel:1:2804

此时流程进入  启动项目环节   通过流程实例ID 查看当前流程 进度

/**
	 * 启动流程 并完成 提交
	 */
	@Test
	public void startProcessAndComp3() {
 
		TaskService taskService = processEngine.getTaskService();
 
		// 查询任务
		Task task = taskService.createTaskQuery().processInstanceId("2901").singleResult();
 
		// 如果任务对象为空,则流程执行结束
		if (task != null) {
			System.out.println("taskID:" + task.getId() + ",name:"
					+ task.getName());
		} else {
			System.out.println("任务执行完毕");
		}
 
		// 通过流程实例ID获取任务对象
		task = taskService.createTaskQuery().processInstanceId("2901").singleResult();
		System.out.println("taskID:" + task.getId() + ",name:" + task.getName());
 
		// 提交任务
		taskService.complete(task.getId());
 
	}
taskID:2904,name:项目启动
taskID:2904,name:项目启动

提交任务后,流程进入并行环节,同时执行 功能模块1 和 功能模块2

包含网关

包含网关描述
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。

包含网关的功能是基于进入和外出顺序流的:

分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。

汇聚: 所有并行分支到达包含网关,会进入等待章台, 直到每个包含流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。

注意,如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时含有分支和汇聚功能。 这时,网关会先汇聚所有拥有流程token的进入顺序流, 再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。

包含网关图形
并行网关显示为一个普通网关(菱形),内部包含一个圆圈图标。

 

当 main config 中的 表达式 条件返回的结果为真时  执行 并行网关 

结果为假时 执行 排他任务

具体的 流程 这里就不介绍了

事件网关

事件网关描述
基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。

注意基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的"执行"。 相反,它们让流程引擎去决定执行到基于事件网关的流程需要订阅哪些事件。 要考虑以下条件:

基于事件网关必须有两条或以上外出顺序流。

基于事件网关后,只能使用intermediateCatchEvent类型。 (activiti不支持基于事件网关后连接ReceiveTask。)

连接到基于事件网关的intermediateCatchEvent只能有一条进入顺序流。

事件网关图形
事件网关和其他BPMN网关一样显示成一个菱形, 内部包含指定图标。

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
Activiti 7 是一个开源的工作流引擎,用于管理和执行工作流程。在工作流程中,有时需要根据不同的条件来决定下一步的执行路径,这时可以使用网关网关是 Activiti 7 中的一个重要元素,它用于根据不同条件选择唯一的下一步执行路径。网关可以根据条件的结果将流程分流到不同的分支或任务,并决定哪个分支或任务将被执行。 在 Activiti 7 中使用网关非常简单。首先,在流程定义文件中使用 `<exclusiveGateway>` 元素定义网关。然后,在网关的输出路径上定义条件,并将每个路径连接到相应的任务或分支。 当流程执行到网关时,它会根据每个路径的条件逐一判断,直到找到满足条件的路径。满足条件的路径将被执行,而其他路径将被忽略。如果没有路径满足条件,流程可能会进入等待状态,直到满足条件的路径出现。 使用网关可以在流程中实现条件分支和合并。它能够根据不同的条件,灵活地控制流程的走向。与其他类型的网关相比,网关更加简单直观,适用于大多数条件判断的场景。 总之,Activiti 7 中的网关是一个用于根据不同条件决定流程执行路径的重要元素。通过定义条件并将流程连接到相应的任务或分支,可以实现灵活的条件分支和合并。使用网关可以优化流程控制,提高工作流的效率和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值