Flowable-服务-骆驼任务

2024-02-01 11:20
文章标签 服务 任务 flowable 骆驼

本文主要是介绍Flowable-服务-骆驼任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • 定义
      • 图形标记
      • XML内容
      • Flowable与Camel集成
      • 使用示例
        • 设计Came路由代码
      • 视频地址:
      • 演示demo

定义

Camel 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Camel 任务是作为一种特殊的服务
任务来实现的。主要做路由工作的。

图形标记

由于 Camel 任务不是 BPMN 2.0 规范的“官方”任务,因此没有提供其专用图标。在 bpmnjs
中 Camel 任务我们就使用服务任务代替,如图所示:

在这里插入图片描述

XML内容

Camel 任务在 Flowable 中定义为一个专用的服务任务,这个服务任务的 type 属性设置为 camel。
Camel 任务的 XML 表示格式如下:

<serviceTask id="camelTask1" name="Camel " flowable:type="camel" />

以上在流程定义的服务任务上定义 Camel 类型即可,集成逻辑都将通过 Camel 容器委托。

Flowable与Camel集成

本节将具体介绍 Flowable 与 Camel 集成的过程,以及 Flowable 基于 Camel 扩展出来的各种特性
和用法。

  1. Camel 的配置与依赖
    默认情况下,使用 Camel 任务时,Flowable 引擎在 Spring 容器中查找 camelContext Bean。camelContext
    Bean 用于定义 Camel 容器装载的 Camel 路由,Camel 路由可以在 Spring 配置文件中定义,也可以按照指
    定的 Java 包装载路由:
   <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"><packageScan><package>com.dragon.test.bpmn.camel.route</package></packageScan></camelContext>

通过以上配置,在初始化时 CamelContext 时会把 com.dragon.test.bpmn.camel.route 中
的路由定义类(继承自 RouteBuilder,后文会讲解)注册到 CamelContext 对象中。CamelContext 是 Camel
中一个很重要的概念,它横跨了 Camel 服务的整个生命周期,并且为 Camel 服务的工作环境提供支撑,
Camel 中的各个 Service 的关联衔接通过 CamelContext 上下文对象完成。
由于 Flowable 的配置文件采用的是 spring bean 配置文件格式,因此在 Flowable 与 Camel 集成时,以上
配置内容可以直接加在 Flowable 的配置文件中。
如果想要定义多个 camelContext,或想使用不同的 Bean 名字,可以在 Camel 任务定义中通过以下方
式指定:

<serviceTask id="camelTask1" name="Camel " flowable:type="camel" />

需要注意的是,如果要使用 Camel 任务,需要在项目中包含 flowable-camel 模块依赖及 Camel 相关依
赖,Maven 依赖定义如下:

   <dependency><groupId>org.flowable</groupId><artifactId>flowable-camel</artifactId><version>xxx</version></dependency><dependency><groupId>org.apache.camel</groupId><artifactId>camel-http</artifactId><version>xxx</version></dependency>
  1. 定义Camel路由
    Camel 最重要的特色之一就是路由,路由用于应用中的通信或者应用间通信。Camel 的路由需要通过
    我们手动编排的方式,在指定的(或可变的)端点间进行数据的传输、过滤、转换等操作。Camel 路由
    易于使用的一个特性是端点 URI,通过指定 URI,可以确定要使用的组件以及该组件是如何被配置的。
    然后可以决定将消息发送到由该 URI 配置的组件,或者使用该组件发出消息。
    flowable 的 flowable-camel 模块提供了 Camel 与 Flowable 通信的桥梁,当流程流转到 Camel 任务后流程
    引擎将调用 Camel 执行对应的路由,同时可以选择把流程变量传递给路由,在路由处理结束后还可以有
    选择地把路由得到的结果以流程变量的方式回传给流程实例。
    我们可以通过 Java DSL 构建 Camel 路由(也可通过 XML 配置,这里不做介绍),需要继承
    org.apache.camel.builder.RouteBuilder 类,然后实现其中的 configure 方法。Flowable 与 Camel 集成后,一个
    典型的路由定义类如下:
   public class GetIpInfoCamelCallRoute extends RouteBuilder {@Overridepublic void configure() {from("flowable:CamelTaskProcessTest:afef07cc915df4771a54048fe871e9c9e?copyVariablesToProperties=true").toD("http://ip-api.com/json/${exchange.getProperty('ip')}?lang=zh-CN&bridgeEndpoint=true").process(new ResultProcessor());}
}

在以上路由定义类的 configure 方法中,通过 Java 的 DSL 语言(域特定语言)描述路由规则,from
和 to 是两个关键字,Camel 会从 from 声明的起始端点将消息路由至 to 声明的终点。所有的路由都以一
个 from 开始,它接受端点 URI 作为参数。flowable-camel 模块定义了“flowable”类型的路由 URI 协议,以
上面的配置为例,from 端点(endpoint)的格式包含冒号和问号分隔的几个部分,各部分的含义如表 15.3
所示。
flowable-camel 模块提供的 URI 协议

属性描述
flowable协议开头,指向引擎端点
CamelTaskProcessTest流程定义 Key
afef07cc915df4771a54048fe871e9c9e流程定义中 Camel 服务的 id
copyVariablesToProperties=true路由 URI 的参数
  1. 路由URI配置
    我们可以通过在 URI 中附加一些参数,使用 Flowable 提供的几种不同的行为,从而实现干预 Camel
    组件的功能。本节将介绍 URI 中支持的参数,包括输入参数和输出参数两类。
    3.1. 输入参数
    Flowable 提供了三种输入参数,可以用于控制将流程变量复制到 Camel 的策略,可配置的输入参数如
    表所示:
    参数对应flowable行为类描述
    copyVariablesToPropertiesorg.flowable.camel.impl.CamelBehaviorDefaultImpl默认配置,将 Flowable 的流程变量复制为 Camel 参数,在路由中可以通过形如${property.variableName}的表达式获取到参数值。
    copyCamelBodyToBodyorg.flowable.camel.impl.CamelBehaviorCamelBodyImpl只将名为"camelBody"的 Flowable 流程变量复制为 Camel 消息体。如果 camelBody 的值是 Map 对象,在路由中可以通过形如 b o d y [ v a r i a b l e N a m e ] 的表达式获取到参数值;如果 c a m e l B o d y 的值是纯字符,可以使用 {body[variableName]}的表达式获取到参数值;如果 camelBody 的值是纯字符,可以使用 body[variableName]的表达式获取到参数值;如果camelBody的值是纯字符,可以使用{body}表达式获取。
    copyVariablesToBodyAsMaporg.flowable.camel.impl.CamelBehaviorBodyAsMapImpl把 Flowable 的所有流程变量复制到一个 Map 对象里,作为 Camel 的消息体。,在路由中可以通过形如${body[variableName]}的表达式获取到参数值。
    以如下路由规则为例:
   from("activiti:CamelTaskProcess:camelTask1?copyVariablesToProperties=true").to("log:org.activiti.camel.examples.SimpleCamelCall");

这里的配置在 URI 中附加了 copyVariablesToProperties=true,表示将 Flowable 的流程变量复制成 Camel
参数。
3.2. 输出参数
同样的,Flowable 提供了几种输出参数,可以用于控制将 Camel 执行结果复制到流程变量的策略,可
配置的输出参数如表所示:
flowable-camel 模块提供的 URI 协议:

参数描述
default默认配置。如果 Camel 消息体是一个 Map 对象,则在路由执行结束后将其中每一个属性复制为 Flowable 的流程变量;否则将整个 Camel 消息体复制到名为"camelBody"的流程变量。
copyVariablesFromProperties将 Camel 参数以相同的名称复制为 Flowable 流程变量。
copyVariablesFromHeader将 Camel Header 中的内容以相同的名称复制为 Flowable 流程变量。
copyCamelBodyToBodyAsString与 default 相同,但如果 Camel 消息体不是 Map 对象,则首先将其转换为字符串,然后再复制到名为"camelBody"的流程变量
以如下路由规则为例:
   from("activiti:CamelTaskProcess:camelTask1?copyVariablesFromProperties=true").to("log:org.activiti.camel.examples.SimpleCamelCall");

这里的配置在 URI 中附加了 copyVariablesFromProperties=true,表示将 Camel 参数以相同的名称复制
为 Flowable 流程变量中。
4. 异步Camel调用
默认情况下,Camel 任务是同步执行的,流程执行到 Camel 任务后将处于等待状态,直到 Camel 执
行结束并返回结果后,才离开 Camel 任务往下继续流转。如果 Camel 任务执行时间比较长,或者某些场
景下不需要同步执行,则可以使用 Camel 任务的异步功能,将 Camel 任务的 async 参数设置为 true 即可
启用这个功能:

   <serviceTask id="camelTask1" name=" Camel " activiti:type="camel"activiti:async="true"/>

设置这个参数后,Camel 路由会由 Flowable 作业执行器异步启动。
5. 通过Camel启动流程
前面几节介绍了如何整合 Camel 与 Flowable,以及两者如何通信,都是先启动 Flowable 流程实例,然
后在流程实例中启动 Camel 路由。反过来,也可以通过 Camel 任务启动或调用流程实例,其 Camel 的路
由规则可以这么设计:

   from("flowable:ParentProcess:camelTaskForStartSubprocess").to("flowable:subProcessCreateByCamel");

其中,from 声明的起始端点的 URI 分为三个部分:"flowable"协议开头,父流程定义 key,Camel 任务
id;to 声明的终止端点的 URI 包含两个部分:"flowable"协议开头,子流程定义 key。

使用示例

下面我们看一个使用 Camel 任务的示例流程,如图所示,用于调用外部第三方服务自动化地
获取 IP 信息。流程发起后首先通过 Camel 任务调用外部 Web 服务查询 IP 信息,然后通过邮件任务发送
查询结果给申请人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbHKxnwk-1690689579641)(…/public/images/service/camel-task.png)]

Camel 路由配置整合到 Flowable 的配置文件中内容如下:

<process id="CamelTaskProcessTest" name="服务-骆驼任务" isExecutable="true"><startEvent id="a4192d69b9d5a4d1faf42b7c9741d0d48" /><sequenceFlow id="a0db08b7fe8d74803b11b59179c6e0a57" sourceRef="a4192d69b9d5a4d1faf42b7c9741d0d48" targetRef="afef07cc915df4771a54048fe871e9c9e" /><serviceTask id="afef07cc915df4771a54048fe871e9c9e" name="获取Ip信息" flowable:type="camel"><extensionElements><flowable:formData /><flowable:assigneeType>static</flowable:assigneeType></extensionElements></serviceTask><sequenceFlow id="Flow_1ce3l0r" sourceRef="afef07cc915df4771a54048fe871e9c9e" targetRef="Activity_1n9nrw6" /><serviceTask id="Activity_1n9nrw6" name="发送邮件" flowable:type="mail"><extensionElements><flowable:field name="to"><flowable:expression>liuwenjun05101@163.com</flowable:expression></flowable:field><flowable:field name="subject"><flowable:string>IP信息查询结果</flowable:string></flowable:field><flowable:field name="html"><flowable:expression>&lt;html&gt;&lt;body&gt;&lt;p&gt;用户&amp;lt;b&amp;gt;${userName}&amp;lt;/b&amp;gt;你好,&amp;lt;br/&amp;gt;&lt;/p&gt;&lt;p&gt;你查询的IP&amp;lt;b&amp;gt;${ip}&amp;lt;/b&amp;gt;的信息为:&amp;lt;br/&amp;gt;&lt;/p&gt;&lt;p&gt;省份:${regionName} 城市:${city}&lt;/p&gt;&lt;p&gt;互联网服务提供商:${isp}&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</flowable:expression></flowable:field><flowable:field name="charset"><flowable:string>utf-8</flowable:string></flowable:field></extensionElements></serviceTask><endEvent id="Event_1l6yldo" /><sequenceFlow id="Flow_1h6rd9m" sourceRef="Activity_1n9nrw6" targetRef="Event_1l6yldo" /></process>

在以上配置中:
1、流程引擎配置使用的是 SpringProcessEngineConfiguration,这是因为 Flowable Camel集成时,
需要通过 SpringProcessEngineConfiguration 获取 camelContext,相关细节读者可自行查看源代码。
2、Camel 路 由 是 通 过 Spring 的 环 境 下 扫 描 路 由 配 置 实现的, Spring 会 扫 描 包 路 径
com.dragon.test.bpmn.camel.route下的 Route 类加载到 camelContext 中。

设计Came路由代码

Camel 路由 Route 的代码如下:

package com.didichuxing.bpm.demo.chapter15.camel.route;
import com.didichuxing.bpm.demo.chapter15.camel.processor.ResultProcessor;
import com.didichuxing.bpm.demo.chapter15.camel.processor.TransformProcessor;
import org.apache.camel.builder.RouteBuilder;
public class GetIpInfoCamelCallRoute extends RouteBuilder {
@Override
public void configure() throws Exception {from("activiti:CamelTaskProcess:camelTask1?copyVariablesToProperties=true").toD("http://ip-api.com/json/${property.ip}?lang=zh-CN&bridgeEndpoint=true").process(new ResultProcessor());
}
}

在以上代码中:
⑴from 声明的起始端点的 URI 中,flowable 为协议开头,CamelTaskProcess 为流程定义 key,
camelTask1 为 Camel 任务 id,输入参数配置的 copyVariablesToProperties=true 表示将 Activiti 的流程
变量复制成 Camel 参数,输出参数使用的默认配置。
⑵终止端点采用 toD 声明,它允许通过表达式的方式来动态定义消息的接收节点,这里使用了
表达式${property.ip},表示从 Camel 参数中获取 ip 属性的值。
⑶路由中使用到了自定义 Processor 处理器 ResultProcessor。Processor 处理器是 Camel 中的一
个重要元素,它用于接收从控制端点、路由选择条件又或者另一个处理器的 Exchange 中传来的消
息信息,并进行处理。我们可以在自定义的 Processor 处理器中做很多事情,比如这里使用它来进
行外部服务返回结果数据格式的转换,代码如下

import com.alibaba.fastjson.JSON;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import java.util.Map;
import java.util.stream.Collectors;
public class ResultProcessor implements Processor {public void process(Exchange exchange) {// camelString camelCallResult =exchange.getIn().getBody(String.class);// camelSystem.out.println("camel" + camelCallResult);// MapMap<String, String> camelCallResultMap = JSON.parseObject(camelCallResult,Map.class);//Map<String, String> resultMap =camelCallResultMap.entrySet().stream().filter(map -> "country".equals(map.getKey()) ||"regionName".equals(map.getKey())|| "city".equals(map.getKey()) ||"isp".equals(map.getKey())).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));// Camel Mapexchange.getOut().setBody(resultMap, Map.class);}
}

在以上代码中,首先获取访问外部服务返回的结果(是一个 json 字符串),然后将其转成 Map
对象,接下来对其 key 进行过滤仅保留 country、regionName、city 和 isp 组成一个新的 Map,最后
将该 Map 作为 Camel 消息体回传给 Flowable。

视频地址:

骆驼任务

演示demo

骆驼任务

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

这篇关于Flowable-服务-骆驼任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667122

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建