• 首页

  • 分类
    JAVA Linux

  • 文章归档

  • 关于

  • 友情链接
T e r l y 的 秘 密 基 地
T e r l y 的 秘 密 基 地

Terly

CV程序员,面向百度编程

01月
15
JAVA

camunda表达式语言

发表于 2021-01-15 • 字数统计 0 • 被 5,393 人看爆

表达语言

Camunda BPM支持统一表达语言(EL),它是JSP 2.1标准(JSR-245)的一部分。因此,它使用开源的JUEL实现。要获得有关表达式语言用法的更多常规信息,请阅读官方文档。特别是提供的示例很好地概述了表达式的语法。

在Camunda BPM中,EL可在许多情况下用于评估类似脚本的小型表达式。下表概述了支持EL使用的BPMN元素。

BPMN元素EL支持
服务任务,业务规则任务,发送任务,消息中间抛出事件,消息结束事件,执行侦听器和任务侦听器表达语言作为委派代码
顺序流表达语言作为序列流的条件表达
所有任务,所有事件,事务,子流程和连接器inputOutput参数映射内的表达式语言
不同元素表达语言作为属性或元素的值
所有流程节点,流程定义表达语言,以确定工作的优先级

表达语言的用法

委托代码

除了Java代码,Camunda BPM还支持将表达式评估为委派代码。有关委派代码的一般信息,请参见相应 部分。

当前支持两种类型的表达式:camunda:expression和 camunda:delegateExpression。

用camunda:expression它可以评价值表达或以调用一个方法表达。您可以使用表达式或Spring和CDI bean中可用的特殊变量。有关变量和Spring以及CDI bean的更多信息,请参见相应的部分。

  <process id="process">
    <extensionElements>
      <!-- execution listener which uses an expression to set a process variable -->
      <camunda:executionListener event="start" expression="${execution.setVariable('test', 'foo')}" />
    </extensionElements>

    <!-- ... -->

    <userTask id="userTask">
      <extensionElements>
        <!-- task listener which calls a method of a bean with current task as parameter -->
        <camunda:taskListener event="complete" expression="${myBean.taskDone(task)}" />
      </extensionElements>
    </userTask>

    <!-- ... -->

    <!-- service task which evaluates an expression and saves it in a result variable -->
    <serviceTask id="serviceTask"
        camunda:expression="${myBean.ready}" camunda:resultVariable="myVar" />

    <!-- ... -->

  </process>

该属性camunda:delegateExpression用于计算为委托对象的表达式。该委托对象必须实现JavaDelegateorActivityBehavior 接口。

  <!-- service task which calls a bean implementing the JavaDelegate interface -->
  <serviceTask id="task1" camunda:delegateExpression="${myBean}" />

  <!-- service task which calls a method which returns delegate object -->
  <serviceTask id="task2" camunda:delegateExpression="${myBean.createDelegate()}" />

注:主要用于监听器和服务任务中

条件

要使用条件序列流,通常使用表达语言。因此, 必须使用conditionExpression这种类型的顺序流元素tFormalExpression。元素的文本内容是要评估的表达式。

在表达式内部,有一些特殊的变量可用于访问当前上下文。要查找有关可用变量的更多信息,请参见相应部分。

以下示例显示了将表达式语言用作顺序流的条件的情况:

  <sequenceFlow>
    <conditionExpression xsi:type="tFormalExpression">
      ${test == 'foo'}
    </conditionExpression>
  </sequenceFlow>

inputOutput参数

使用CamundainputOutput扩展元素,您可以映射inputParameter或outputParameter 表达式语言。

在表达式内部,有一些特殊的变量可用于访问当前上下文。要查找有关可用变量的更多信息,请参见相应部分。

以下示例显示了一个inputParameter使用表达式语言来调用Bean方法的。

  <serviceTask id="task" camunda:class="org.camunda.bpm.example.SumDelegate">
    <extensionElements>
      <camunda:inputOutput>
        <camunda:inputParameter name="x">
          ${myBean.calculateX()}
        </camunda:inputParameter>
      </camunda:inputOutput>
    </extensionElements>
  </serviceTask>

表达式语言中变量和函数的可用性

过程变量

当前作用域的所有过程变量都可以在表达式内直接使用。因此,条件序列流可以直接检查变量值:

  <sequenceFlow>
    <conditionExpression xsi:type="tFormalExpression">
      ${test == 'start'}
    </conditionExpression>
  </sequenceFlow>

内部上下文变量

根据当前的执行上下文,在评估表达式时可以使用特殊的内置上下文变量:

变量Java类型语境
executionDelegateExecution在BPMN执行上下文中可用,例如服务任务,执行侦听器或序列流。
taskDelegateTask在任务上下文(如任务侦听器)中可用。
caseExecutionDelegateCaseExecution在CMMN执行上下文中可用。
authenticatedUserIdString当前经过身份验证的用户的ID。仅当通过的相应方法设置了当前认证用户的ID时,才返回一个值 IdentityService。否则返回null。

下面的示例显示一个表达式,该表达式将变量设置为test执行侦听器的当前事件名称。

  <camunda:executionListener event="start"
    expression="${execution.setVariable('test', execution.eventName)}" />

注:在流程开启异步后,在异步线程中可能无法通过authenticatedUserId 为null,已证实,下面为解决方案

官方社区里给出的解决方案:https://forum.camunda.org/t/identityservice-getcurrentauthentication-is-null-after-timer-boundary-event/15263

就是在创建用户任务时,将id存储到过程变量中,通过execution.getVariable(id)或task.getVariable(id)获取

使用Spring和CDI的外部上下文变量

如果流程引擎与Spring或CDI集成在一起,则可以在表达式内部访问Spring和CDI Bean。 有关更多信息,请参见Spring和CDI的相应部分。以下示例显示了将JavaDelegate接口实现为委托执行的bean的用法 。

  <serviceTask id="task1" camunda:delegateExpression="${myBean}" />

使用expression属性,可以调用Bean的任何方法。

  <serviceTask id="task2" camunda:expression="${myBean.myMethod(execution)}" />

内部上下文功能

评估表达式时,可以使用特殊的内置上下文函数:

功能返回类型描述
currentUser()String返回当前已认证用户的用户标识,或者当前null没有用户通过认证。
currentUserGroups()List of Strings返回当前已认证用户的组ID列表,或者null如果当前没有用户授权,则返回该组ID的列表。
now()Date以Java Date对象的形式返回当前日期。
dateTime()DateTime返回当前日期的Joda-Time DateTime对象。 有关所有可用功能,请参阅 Joda-Time文档。

以下示例将用户任务的截止日期设置为任务创建后的3天。

<userTask id="theTask" name="Important task" camunda:dueDate="${dateTime().plusDays(3).toDate()}"/>

注:在流程开启异步后,在异步线程中可能无法通过currentUser()获取用户信息,未做证实

分享到:
flutter手势检测及触摸
camunda多实例任务会签配置说明
  • 文章目录
  • 站点概览
Terly

程序员 Terly

面向百度编程!

Email RSS
看爆 Top5
  • camunda表达式语言 5,394次看爆
  • camunda多实例任务会签配置说明 3,646次看爆
  • nginx代理项目 项目内部跳转导致丢失端口 1,235次看爆
  • Windows安装Mysql解压版 1,184次看爆
  • 密码校验正则表达式 1,142次看爆
桂ICP备14005919号 桂公网安备 45080302000114号

站点已萌萌哒运行 00 天 00 小时 00 分 00 秒(●'◡'●)ノ♥

Copyright © 2023 Terly

由 Halo 强力驱动 · Theme by Sagiri · 站点地图