文档章节

.NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用

o
 osc_7slii3nj
发布于 07/01 12:38
字数 1451
阅读 29
收藏 0

精选30+云产品,助力企业轻松上云!>>>

前言:工作流流程过程中,除了正常的人工审批类型的节点外,事件类型的节点处理也尤为重要。比如比较常见的事件类型的节点有: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的方式,可以保障业务系统跟流程关联系统集成关联的可靠性。存在消息队列中的消息主题,可以被消息订阅方在后期处理,使得系统的部署更加灵活,降低了系统之间的耦合性。其次,跨流程直接的消息通讯比较常见,通过集成消息队列来存储消息和分发消息,可以使得业务系统处理的能力加强。从单一流程的流转过度到多流程直接的集体协作模式。

o
粉丝 0
博文 56
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
.NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用

前言:工作流流程过程中,除了正常的人工审批类型的节点外,事件类型的节点处理也尤为重要。比如比较常见的事件类型的节点有:Timer/Message/Signal等。本文重点阐述消息类型的节点处理,以及...

slickflowteam
06/30
0
0
SpringBoot RabbitMQ 集成 创建项目

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编...

阿刚ABC
2019/04/30
36
0
初识消息队列/RabbitMQ详解

dotNET跨平台
04/11
0
0
RabbitMQ安装与配置

RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的...

osc_1aqasaed
2018/11/01
2
0
C#消息队列(MQ)零基础从入门到实战演练

一、课程介绍 如果您从工作中之听过但未有接触过消息对队列(MQ),如果你接触过一点关于MQ的知识,如果没有这么的多如果的话......,那么阿笨将通过本次《C#消息队列零基础从入门到实战演练》...

阿笨NET
2018/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于朋友圈《小心新型二维码钓鱼》揭秘

首先感谢钟馗之眼公开的攻击过程,感谢您的无私分享 老文章,当时没有粉丝,在发一遍 今天刷着手机,突然被朋友圈里一篇名为《小心新型二维码钓鱼》的文章吸引,看完演示视频心里久久不能平静...

Gcow
03/01
0
0
技术人要具备水平与垂直的切换能力

互联网公司待时间长了,就会发现,每年特定时间段,公司都会根据上一时期业务发展情况,进行组织结构调整,团队阵型被分分合合。 有人开心,有人失落。 重新划分团队的过程,通常: 有人上位...

码闻强识
2019/10/30
0
0
如何实现数字资产的冷存储?

所有信息,只要连到互联网上,就有可能泄露。 这方面的教训太多了,以至于人们对大规模信息泄露这种新闻连看都不想看了,因为这太寻常了。 本质原因在于,所有的信息系统,都会有漏洞,正如所...

卫_sir
02/02
0
0
K8S 生态周报| 2019.03.25~2019.03.31

> 「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」。 ## Kubernetes 1.14 正式发布 1.14 的主要更新: * 对 Windows Node 和...

张晋涛-MoeLove
2019/04/01
0
0
【面试题 16.01】交换数字 (异或)

题目 题目链接 编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。 示例: 输入: numbers = [1,2]输出: [2,1] 提示: numbers.length == 2 解题思路 1 创建数组开辟了一点...

osc_3nr2bq5w
6分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部