zoukankan      html  css  js  c++  java
  • .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. 消息队列服务配置

    1). RabbitMQ 管理面板

        RabbitMQ带有后台面板监控,可以看到消息队列中的数据情况,可以帮助开发人员调试消息处理程序的正常工作。

         2) IIS 过期时间设置

        在集成过程中,流程内部消息的订阅服务是托管在IIS的应用程序池,其过期时间默认是20分钟,需要设置为0,这样消息记录的订阅监控,不会过期,一直监听消息发布状态。

     

    6. 辅助开发工具

    1) Slickflow 流程设计器

    http://demo.slickflow.com/sfd/

    2) Slickflow Web测试工具

    http://demo.slickflow.com/sfw2/

    3) 开源项目地址

    https://github.com/besley/Slickflow

    7. 总结

       流程引擎集成消息队列RabbitMQ的方式,可以保障业务系统跟流程关联系统集成关联的可靠性。存在消息队列中的消息主题,可以被消息订阅方在后期处理,使得系统的部署更加灵活,降低了系统之间的耦合性。其次,跨流程之间消息通讯比较常见,通过集成消息队列来存储消息和分发消息,可以使得业务系统处理的能力加强。从单一流程的流转过度到多流程之间的集体协作模式。

  • 相关阅读:
    QQ家园熄灭不了解决方法
    那时我们还年轻[转]
    QQ游戏图标熄灭大全
    FlashDevelop快捷键
    linux 全局搜索某一文件并将文件内容并进行替换的命令
    navigate 10.0.5 regist cn
    线程、socket、stl 以及并发设计
    drupal真不错
    网卡问题解决思路linux版
    socket错误:Program received signal SIGPIPE, Broken pipe
  • 原文地址:https://www.cnblogs.com/slickflow/p/12909468.html
Copyright © 2011-2022 走看看