服务

本文中内容和案例节选自贺波老师的《深入Activiti流程引擎:核心原理与高阶实战》一书。这本书中的内容更为全面、详尽,对系统学习和深入掌握Activiti/Flowable的用法非常有帮助,推荐给大家。

QQ交流群1:633168411 已满
QQ交流群2: 582010059

参照本书录制的讲解视频地址

博客地址

服务任务(Service Task)是一个自动化任务,一般被用作调用服务。当流程执行到服务任务时,可以自动执行编写的 Java 程序,完毕后继续执行后继路线。

Flowable服务组件可划分为七类

  • 服务任务
  • 邮件任务
  • 骆驼任务
  • 消息服务任务
  • Http服务任务
  • Rest服务任务
  • 微服务任务
  • 决策任务

服务任务

定义

服务任务(Service Task)是一个自动化任务,无须人为参与,一般被用作调用服务。当流程执行到服务任务 时,可以自动执行编写的 Java 程序实现自定义的业务逻辑,完毕后继续执行后继路线。

图形标记

服务任务显示成一个普通任务(圆角矩形),左上角有一个小齿轮图标,如图所示:

service-task

XML内容

服务任务由 serviceTask 元素定义,Flowable 提供了 3 种方法来声明 java 调用逻辑。

1、通过 flowable:class 属性指定一个 Java 类 通过这种方式指定一个在流程执行时调用的 Java 类,需要在 serviceTask 的 flowable:class 属性中 指定合法的全路径类名,该类必须实现 JavaDelegate 或者 ActivityBehavior 接口。

1.1、指定为实现了 JavaDelegate 接口的类

<serviceTask id="serviceTask1" name="服务任务" flowable:class="xxx.xxx.xxx.MyJavaDelegate" />

其中通过 flowable:class 属性指定了调用 Java 类为 xxx.xxx.xxx.MyJavaDelegate,它实现了 org.flowable.engine.delegate.JavaDelegate 类,并重写了 execute 方法:

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
public class MyJavaDelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        //编写自己的逻辑
    }
}

1.2、指定为实现了 ActivityBehavior 接口的类

<serviceTask id="serviceTask2" name=" " flowable:class="xxx.xxx.xxx.MyActivityBehavior" />

其中通过 flowable:class 属性指定了调用 Java 类为 xxx.xxx.xxx.MyActivityBehavior,它实现了 org.flowable.engine.impl.delegate.ActivityBehavior 类,并重写了 execute 方法:

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.impl.delegate.ActivityBehavior;
public class MyActivityBehavior implements ActivityBehavior {
    @Override
    public void execute(DelegateExecution execution) {
        //编写自己的逻辑
    }
}

通过 flowable:class 属性指定的 Java 类,当流程执行到服务节点时,会调用其 execute 方法执行 定义好的业务逻辑,然后按照默认 BPMN 2.0 中的方式离开该节点。在 execute 方法中如果要用到流程实 例、流程变量等,可以通过 DelegateExecution 进行来获取和操作。

需要注意的是,服务任务通过 flowable:class 属性指定的 Java 类只会创建一个实例,即只在第一 次调用时实例化一个对象,该对象会被复用,而不是每次都会实例化一个对象。所有的流程实例都 会共享相同的类实例,并调用其 execute(DelegateExecution)方法。这就意味着,该 Java 类不能使用 任何成员变量,必须是线程安全的,因为它可以从不同的线程同时执行。这也影响着属性注入的处 理方式,下一节会进行介绍.

流程定义中由服务任务使用 flowable:class 属性指定的类不会在流程部署时实例化。只有当流程 执行第一次到达调用该类的服务节点时,才会创建该类的一个实例。如果找不到类,会抛出一个 FlowableException 异常。

2、通过 flowable:delegateExpression 使用委托表达式指定 可以使用解析为对象的表达式来指定,该对象必须遵循与使用 flowable:class 属性时创建的对象 相同的规则。

<serviceTask id="serviceTask3" name="服务任务" flowable:delegateExpression="${delegateExpressionBean}" />

其中通过 flowable:delegateExpression 属性指定了委托表达式为${delegateExpressionBean}, delegateExpressionBean 是一个实现了 JavaDelegate 接口的 bean,表达式调用之前需要将它初始化到 流程变量中,或者定义在实例的 spring 容器中。委托表达式中只用写 bean 的名称,不需要写方法 名,引擎会自动调用其 execute 方法。

3、通过 flowable:expression 属性使用 UEL 表达式指定 可以通过 flowable:expression 属性指定为 UEL 方法表达式或值表达式,调用一个普通 java bean 的方法或属性,表达式调用之前需要将它初始化到流程变量中,或者定义在实例的 spring 容器中。 这个 bean 不需要实现 org.flowable.engine.delegate.JavaDelegate 接口,表达式中必须指定调用的方法名或属性名。 可以通过flowable:resultVariable="totalMount" 指定返回结果赋值到变量中 3.1、指定为 UEL 方法表达式 表达是可以为无参表达式:

<serviceTask id="serviceTask4"
name="服务任务"
flowable:expression="${businessBean.calculateMount1()}"
flowable:resultVariable="totalMount"/>

上述服务任务定义表示调用 businessBean 对象的 calculateMount1(无参数)方法。 也可以为表达式中的方法传递参数:

<serviceTask id="serviceTask5"
name="服务任务"
flowable:expression="${businessBean.calculateMount2(execution, money)}" />

上述服务任务定义表示会调用 businessBean 对象的 calculateMount2 方法,该方法第一个参数 是 DelegateExecution,在表达式环境中默认名称为 execution,第二个参数传递的是当前流程的名为 money 的变量。 3.2、指定为 UEL 值表达式

<serviceTask id="serviceTask6"
name="服务任务"
flowable:expression="#{businessBean.total}" />

上述服务任务定义会获取 businessBean 的 total 字段的值,实质是调用其 getTotal()方法。

界面操作

演示demo

服务任务

邮件任务

定义

Flowable 支持通过自动的邮件服务任务(Email Task)增强业务流程,它可以向一个或多个收信人发送 邮件,支持 cc,bcc,HTML 内容等。 流程流转到邮件任务时,会给指定的人发送邮件。需要注意的是,邮件任务不是 BPMN 2.0 规范的 “官方”任务,所以也没有专用图标。在 Flowable 中,邮件任务是作为一种特殊的服务任务来实现的。

图形标记

在 Flowable 中邮件任务是在服务任务标签中加入一个type属性指定为邮件任务,BPMNJS的图形统一采用服务图标:

Email-task

XML内容

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

 <serviceTask id="Activity_1rev938" name="邮件发送" flowable:type="mail">
      <extensionElements>
        <flowable:field name="to">
          <flowable:expression>liuwenjun@163.com</flowable:expression>
        </flowable:field>
        <flowable:field name="subject">
          <flowable:string>发送退款申请邮件</flowable:string>
        </flowable:field>
        <flowable:field name="html">
          <flowable:expression>&lt;html&gt;&lt;body&gt;&lt;p&gt;${user}发起退款${money}&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>

邮件任务可以通过属性注入的方式配置各种属性,这些属性的值可以使用 EL 表达式,并将在流程执 行时进行解析。邮件任务可以配置如表所示的属性:

属性是否必须描述
to邮件接收者的邮箱地址。可以使用逗号分隔多个接收者邮箱地址
from邮件发送人的邮箱地址。如果不提供,会使用默认配置的地址(默认地址配置见下文介绍)
subject邮件的主题
cc邮件抄送人的邮箱地址。可以使用逗号分隔多个抄送人邮箱地址
bcc邮件密送人的邮箱地址。可以使用逗号分隔多个密送人邮箱地址
charset用于指定邮件的字符集,对很多非英语语言是必须设置的
html邮件的 HTML 文本
text邮件的内容,用于纯文本邮件。对于不支持富文本内容的客户端,可以与 html 一起使用,邮件客户端可以降级为显式纯文本格式
htmlVar存储邮件 HTML 内容的流程变量名。与 html 属性的不同之处在于,这个属性会在邮件任务发送前,使用其内容进行表达式替换
textVar存储邮件纯文本内容的流程变量名。与 text 属性的不同之处在于,这个属性会在邮件任务发送前,使用其内容进行表达式替换。
ignoreException当处理邮件失败时,是忽略还是抛出 FlowableException。默认值为 false
exceptionVariableName如果设置 ignoreException = true,而处理邮件失败时,则使用此属性指定名字的变量保存失败信息

邮件服务器配置

为了使用邮件任务发送邮件,需要事先为 Flowable 配置支持 SMTP 功能的外部邮件服务器,可以在flowable配置文件中配置如表所示的属性

#配置发送邮箱地址
flowable.mail.server.default-from=xxxx@qq.com
#配置smtp
flowable.mail.server.host=smtp.qq.com
#用户名
flowable.mail.server.username=xxxx
#密码
flowable.mail.server.password=xxxx
#端口
flowable.mail.server.s-s-l-port=465
#是否是SSL
flowable.mail.server.use-ssl=true
#是否是TLS
flowable.mail.server.use-tls=false

界面操作

演示demo

邮件任务

骆驼任务

定义

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

图形标记

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

Email-task

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 {
    @Override
    public 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 对象,在路由中可以通过形如${body[variableName]}的表达式获取到参数值;如果 camelBody 的值是纯字符,可以使用${body}表达式获取。
    copyVariablesToBodyAsMaporg.flowable.camel.impl.CamelBehaviorBodyAsMapImpl把 Flowable 的所有流程变量复制到一个 Map 对象里,作为 Camel 的消息体。,在路由中可以通过形如${body[variableName]}的表达式获取到参数值。
    以如下路由规则为例:
   from("flowable:CamelTaskProcess:camelTask1?copyVariablesToProperties=true")
   .to("log:org.flowable.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("flowable:CamelTaskProcess:camelTask1?copyVariablesFromProperties=true")
   .to("log:org.flowable.camel.examples.SimpleCamelCall");

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

   <serviceTask id="camelTask1" name=" Camel " flowable:type="camel"
   flowable: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 信息,然后通过邮件任务发送 查询结果给申请人

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("flowable:CamelTaskProcess:camelTask1?copyVariablesToProperties=true")
    .toD("http://ip-api.com/json/${property.ip}?lang=zh-CN&bridgeEndpoint=true")
    .process(new ResultProcessor());
}
}

在以上代码中:

  1. from 声明的起始端点的 URI 中,flowable 为协议开头,CamelTaskProcess 为流程定义 key, camelTask1 为 Camel 任务 id,输入参数配置的 copyVariablesToProperties=true 表示将 Flowable 的流程 变量复制成 Camel 参数,输出参数使用的默认配置。
  2. 终止端点采用 toD 声明,它允许通过表达式的方式来动态定义消息的接收节点,这里使用了 表达式${property.ip},表示从 Camel 参数中获取 ip 属性的值。
  3. 路由中使用到了自定义 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) {
        // camel
        String camelCallResult =exchange.getIn().getBody(String.class);
        // camel
        System.out.println("camel" + camelCallResult);
        // Map
        Map<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 Map
        exchange.getOut().setBody(resultMap, Map.class);
    }
}

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

演示demo

骆驼任务

消息服务任务

定义

Mq 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Mq 任务是作为一种特殊的服务 任务来实现的,主要做Mq消息发送。

图形标记

由于 Mq 任务不是 BPMN 2.0 规范的“官方”任务,因此没有提供其专用图标, 而是复用了服务任务的图标:

Mq-task

XML内容

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

<serviceTask id="Mq消息" name="自动发送短信" flowable:type="mq" />

以上在流程定义的服务任务上定义 Mq 类型即可,集成Rabbitmq来实现。

集成Rabbitmq

MqTask面前支持Rabbitmq的消息发送

引入pom包

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
  </dependency>

配置rabbitmq

spring.rabbitmq.host=主机
spring.rabbitmq.enable=true
spring.rabbitmq.port=端口
spring.rabbitmq.username=用户名
spring.rabbitmq.password=密码
spring.rabbitmq.virtual-host=virtual-host
spring.rabbitmq.Ssl.enabled=true
spring.rabbitmq.Ssl.verify-hostname: false

操作界面

演示demo

消息任务

Http服务任务

定义

Http 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Http 任务是作为一种特殊的服务 任务来实现的,主要调用Http服务使用。

图形标记

由于 Http 任务不是 BPMN 2.0 规范的“官方”任务,因此没有提供其专用图标, 而是复用了服务任务的图标:

Http-task

XML内容

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

<serviceTask id="Activity_0jl7867" name="调用Http服务" flowable:type="http" flowable:parallelInSameTransaction="true">
    <extensionElements>
        <flowable:field name="requestMethod">
            <flowable:string>GET</flowable:string>
        </flowable:field>
        <flowable:field name="requestUrl">
            <flowable:string>https://www.baidu.com</flowable:string>
        </flowable:field>
        <flowable:field name="requestHeaders">
            <flowable:string>Content-Type: application/json</flowable:string>
        </flowable:field>
        <flowable:field name="disallowRedirects">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="ignoreException">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="saveResponseParametersTransient">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="saveResponseVariableAsJson">
            <flowable:string>false</flowable:string>
        </flowable:field>
    </extensionElements>
</serviceTask>

以上在流程定义的服务任务上定义 Http 类型即可。

参数说明:

属性名称属性说明
requestUrl请求的url
requestHeaders请求头信息
requestMethod请求方式
requestBody请求参数
disallowRedirects是否允许重定向
ignoreException是否忽略异常
saveResponseParametersTransient是否保存瞬时变量
saveResponseVariableAsJson是否保存json格式
saveResponseParameters是否返回结果保持到流程实例变量中
responseVariableName返回结果保持到流程变量的名称

注意:

1、忽略异常设置成是,组件会停留在这里

2、保留结果:汇报请求的结果保持到流程变量中去

界面操作

演示demo

Rest任务

Rest服务任务

定义

Rest 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Rest 任务是作为一种特殊的服务 任务来实现的,主要调用rest服务使用。

图形标记

由于 Rest 任务不是 BPMN 2.0 规范的“官方”任务,因此没有提供其专用图标, 而是复用了服务任务的图标:

Rest-task

XML内容

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

<serviceTask id="Activity_0tuo1jl" name="Rest回调" flowable:type="rest">
    <extensionElements>
        <flowable:field name="requestUrl">
            <flowable:string>https://www.baidu.com</flowable:string>
        </flowable:field>
        <flowable:field name="requestMethod">
            <flowable:string>POST</flowable:string>
        </flowable:field>
        <flowable:field name="ignoreException">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="saveResponseParameters">
            <flowable:string>false</flowable:string>
        </flowable:field>
    </extensionElements>
</serviceTask>

以上在流程定义的服务任务上定义 Rest 类型即可。

界面操作

参数说明:

属性名称属性说明
requestUrl请求的url
requestHeaders请求头信息
requestMethod请求方式
requestBody请求参数
ignoreException是否忽略异常
saveResponseParameters是否返回结果保持到流程实例变量中
responseVariableName返回结果保持到流程变量的名称

注意:

1、忽略异常设置成是,组件会停留在这里

2、保留结果:汇报请求的结果保持到流程变量中去

演示demo

[Rest任务](Rest任务

微服务任务

定义

Sc 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Sc 任务是作为一种特殊的服务 任务来实现的,主要调用springcloud的微服务使用。

图形标记

由于 Sc 任务不是 BPMN 2.0 规范的“官方”任务,因此没有提供其专用图标, 而是复用了服务任务的图标:

Sc-task

XML内容

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

 <serviceTask id="Activity_1ip6ske" name="微服务回调" flowable:type="sc">
    <extensionElements>
        <flowable:field name="serviceId">
            <flowable:string>flow-center</flowable:string>
        </flowable:field>
        <flowable:field name="url">
            <flowable:string>/api/order/getOrderInfo</flowable:string>
        </flowable:field>
        <flowable:field name="method">
            <flowable:string>POST</flowable:string>
        </flowable:field>
        <flowable:field name="params">
            <flowable:expression>{"id":"liuwenjun","name":"${name}"}</flowable:expression>
        </flowable:field>
        <flowable:field name="ignoreException">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="saveResponseParameters">
            <flowable:string>false</flowable:string>
        </flowable:field>
    </extensionElements>
</serviceTask>

以上在流程定义的服务任务上定义 sc 类型即可。

参数说明:

属性名称属性说明
serviceId微服务的serviceId
url请求的url
method请求方式
params请求参数
ignoreException是否忽略异常
saveResponseParameters是否返回结果保持到流程实例变量中
responseVariableName返回结果保持到流程变量的名称

注意:

1、忽略异常设置成是,组件会停留在这里

2、保留结果:汇报请求的结果保持到流程变量中去

界面操作

演示demo

微服务任务

决策任务

顺序流是一端带有箭头的实线,可在流程图中连接流程内的各个元素,并显示各个元素的执行顺序。 决策任务是集成DMN组件,集成BPMN使用,通过流程变量输入经过决策引擎输出变量

Flowable 支持的决策有:

  • 决策表
  • 决策服务

决策表

定义

决策任务是 不是BPMN流程定义元素。决策任务通过流程引擎的全局变量输入条件经过DMN引擎 得到输出结果,输出结果存入流程引擎的全局变量中

图形标记

决策任务表示为一个决策表格如图所示:

sequenceflow

XML内容

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

<bpmn:serviceTask id="Activity_0dleo8v" flowable:type="dmn">
    <bpmn:extensionElements>
        <flowable:field name="fallbackToDefaultTenant">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="decisionTaskThrowErrorOnNoHits">
            <flowable:string>false</flowable:string>
        </flowable:field>
        <flowable:field name="decisionTableReferenceKey" text="商品折扣决策">
            <flowable:string>DiscountCalculationDecision</flowable:string>
        </flowable:field>
    </bpmn:extensionElements>
</bpmn:serviceTask>

以上在流程定义的服务任务上定义 dmn 类型即可。

参数说明:

属性名称属性说明
fallbackToDefaultTenant回退到默认租户
decisionTaskThrowErrorOnNoHits如果未命中任何规则,则引发错误
decisionTableReferenceKeydmn的key

使用示例

sequenceflow

敬请期待