.NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用
前言:工作流流程过程中,除了正常的人工审批类型的节点外,事件类型的节点处理也尤为重要。比如比较常见的事件类型的节点有:Timer/Message/Signal等。本文重点阐述消息类型的节点处理,以及实现消息驱动流程过程中对消息队列(RabbitMQ)的集成使用方式。
1. 节点间消息传递
1.1 MessageThrow
消息抛出节点,当执行到这个节点时,特定消息主题的消息记录将会添加到消息队列,然后等待被订阅的消息消费者来激活消息处理服务。
1.2 MessageCatch
消息接收节点,消息接收节点上定义了消息主题,并且在消息队列中订阅了该主题。当有特定主题的消息被发布时候,消息消费者会捕获到消息主题,同时消息处理服务中,将会定位到流程的该节点位置,然后通过流程服务来判定下一步的流转流转。
1.3 单一流程内的节点消息传递
该流程只进行消息的发布或者接收,而消息的另外一方则可能是业务系统。两者之间的关联是靠消息主题来识别。如下图所示:

1.4 跨流程间的节点消息传递
通常可以用泳道流程来表示跨流程间的消息通知。泳道流程中,有多个流程,其中一个是泳道主流程,其它的则为泳道附属流程。将会在下面的章节中具体描述。
2. 跨流程消息传递
2.1 泳道流程
泳道流程中,使用多个泳道来区分不同的流程,流程之间可以通过消息来传递信息,如下图所示:

2.2 消息节点类型
消息节点在流程中的位置主要有:开始节点(Start)、中间节点(Internmediate)和结束节点(End)
3. 消息队列(RabbitMQ)集成使用
3.1 消息队列介绍
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
来源:https://baike.baidu.com/item/rabbitmq/9372144?fr=aladdin
3.2 消息队列集成引擎
Slickflow引擎集成RabbitMQ消息队列,其特点是:已经经过大量用户案例检验,证明性能能够满足日常业务需求,同时文档丰富,便于开发人员学习上手。
4. 泳道流程消息队列集成案例
下图是泳道流程的具体示例,包含了一个主流程,和一个泳道附属流程,两个流程间的触发处理,是靠消息来传递。
4.1 流程协作说明
1) 泳道附属流程的启动
泳道附属流程的开始节点(StartCatch)是一个消息接收节点,其接收内容来自主流程的中间消息节点(IntermediateThrow)。当订单主流程的“同步订单”节点完成后,将会发布消息,此时,生产附属流程因为订阅了该消息主题,所以根据开始节点的类型为消息触发类型,生产附属流程将会被启动,生成新的流程实例。
2) 中间消息节点接收消息
流程运行到到中间节点位置后,需要等待特殊主体的消息记录后,然后才能继续流转。常见的场景:比如电子商务系统接入第三方支付系统时,当商城客户下单支付后,从第三方回传支付成功的消息后,当前的订购流程财主继续向下流转。这种消息等待接收的处理,就可以使用消息队列来完成。
在泳道流程中,当"生产计划"流程完成后,将会发布消息给主流程,泳道主流程接收到消息后,可以继续处理当前的节点,并且向下进行流程流转到"客户反馈"节点。
4.2 消息驱动过程说明
1) 消息发布代码示例
/// <summary>
/// 消息发布
/// </summary>
/// <param name="topic">主题</param>
/// <param name="line">内容</param>
public void Publish(string topic, string line)
{
var channel = MQClientFactory.CreatePublishChannel();
channel.QueueDeclare(queue: topic,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null); var body = Encoding.UTF8.GetBytes(line);
channel.BasicPublish(exchange: "",
routingKey: topic,
basicProperties: null,
body: body);
}
2) 消息订阅代码示例
/// <summary>
/// 消息订阅
/// </summary>
/// <param name="topic">主题</param>
/// <returns></returns>
public void Subscribe(string topic)
{
var channel = MQClientFactory.CreateRecieveChannel();
channel.QueueDeclare(queue: topic,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null); var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var line = Encoding.UTF8.GetString(body);
var msgMediator = new MessageMediator();
msgMediator.InvokeFromMessage(ConsumeMessageFunction, topic, line);
};
channel.BasicConsume(queue: topic,
autoAck: true,
consumer: consumer);
}
5. 消息队列数据监控
RabbitMQ带有后台面板监控,可以看到消息队列中的数据情况,可以帮助开发人员调试消息处理程序的正常工作。

6. 总结
流程引擎集成消息队列RabbitMQ的方式,可以保障业务系统跟流程关联系统集成关联的可靠性。存在消息队列中的消息主题,可以被消息订阅方在后期处理,使得系统的部署更加灵活,降低了系统之间的耦合性。其次,跨流程直接的消息通讯比较常见,通过集成消息队列来存储消息和分发消息,可以使得业务系统处理的能力加强。从单一流程的流转过度到多流程直接的集体协作模式。
.NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用的更多相关文章
- .NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成
前言: 在Slickflow产品开发过程中,前端流程设计器经历了几个不同的版本(jsPlumb, mxGraph等),目的是为了在设计流程时的用户体验更加良好,得到客户的好评和认可.BpmnJS流程设 ...
- .NET 开源工作流: Slickflow流程引擎高级开发(八) -- 审批网关(ApprovalOrSplit)模式的应用
前言:业务流程流转过程中,审批类型的节点是比较常见的,在审批操作中,常见的操作就是就是主管人员对待办事项进行同意或者拒绝.所以网关处理节点,就是需要对这两种审批结果进行预备处理,审批网关是在或分支(O ...
- .NET 开源工作流: Slickflow流程引擎高级开发(九) -- 条件事件模式解释及应用
前言:在流程流转过程中,有时候需要条件模式的支持,这样可以使得流程流转更加灵活多变.比如在业务变量满足一定的条件时,可以启动特定配置的流程(或者位于主流程内部的子流程).本文主要描述条件启动和条件中间 ...
- Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
前言: 流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...
- asp.net开源流程引擎API开发调用接口大全-工作流引擎设计
关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 一.程序调用开发接口二. 接口说明 所谓的驰骋工作流引擎的接口,在B ...
- Slickflow.NET 开源工作流引擎高级开发(二) -- 流程快速测试增值服务工具介绍
前言:流程是由若干个任务节点组成,流转过程就是从一个节点转移到下一个节点,通常需要不断切换用户身份来完成流程的测试,这样使得测试效率比较低下,本文从实战出发,介绍常见的两种快速测试方法,用于提升流程测 ...
- Slickflow.NET 开源工作流引擎高级开发(一) -- 流程外部事件的调用和变量存储实现
前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且 ...
- Slickflow.NET 开源工作流引擎高级开发(六) -- WebTest 引擎接口模拟测试工具集
前言:引擎组件的接口测试不光是程序测试人员使用,而且也是产品负责人员需要用到的功能,因为在每一步流转过程中,就会完整模拟实际用户发生的场景,也就容易排查具体是程序问题还是业务问题,从而快速定位问题,及 ...
- java工作流系统-流程引擎执行自定义URL
关键词:工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 bpm工作流系统 java工作流主流框架 自定义工作流引擎 概要介绍: 用户在表达自己的业务逻辑时 ...
随机推荐
- Spring ( 二 ) IOC 依赖注入
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.什么是IOC IOC 全称指的是 Inverse Of Control 控制反转. 原来我们使用Sp ...
- Java实现 LeetCode 581 最短无序连续子数组(从两遍搜索找两个指针)
581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...
- Java实现 LeetCode 295 数据流的中位数
295. 数据流的中位数 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2. ...
- Java实现 LeetCode 230 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...
- Java中继承的详细用法
关于上一篇构造方法后的继承方法 构造方法链接 extends是继承的关键字 例: 下面的代码BB和CC就是AA的子类 允许一个父类有多个子类,但不允许一个子类有多个父类 /*final*/ class ...
- java实现棋盘上的麦子
** 棋盘上的麦子** 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8 ...
- Linux 自动挂载与fstab文件修复
/etc/fstab文件 自动挂载就是写入/etc/fstab文件 vi /etc/fstab 其中,第九行是/分区的自动挂载信息,有6个字段 第一字段表示分区的UUID(硬盘通用唯一识别码,使用du ...
- Linux 文件特殊权限-Sticky BIT
SBIT粘着位作用 只对目录有效 普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写权限 如果没有粘着位,普通拥有写权限,就可以删除目录下所有文件,包括其他用户创建的文件,一旦有粘着位,只有r ...
- MySql多表查询优化
一.多表查询连接的选择 相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询.然后要告诉大家的是,需要根据查询的信息,想好 ...
- Zabbix+Orabbix监控oracle数据库表空间
Orabbix 是设计用来为 zabbix 监控 Oracle 数据库的插件,它提供多层次的监控,包括可用性和服务器性能指标. 它提供了从众多 oracle 实例采集数据的有效机制,进而提供此信息的监 ...