Skip to content

Inline 任务

Inline 任务是 Taskflow 中的一种特殊系统任务,用于在工作流执行过程中直接执行 JavaScript 代码。它提供了一种灵活的方式来处理数据转换、条件判断和简单的业务逻辑。

核心特性

  1. 脚本执行

    • 支持 ES6+ JavaScript
    • 内置工具函数库
    • 同步执行模式
  2. 数据处理

    • 工作流上下文访问
    • 复杂对象处理
    • 类型转换支持
  3. 安全控制

    • 沙箱执行环境
    • 资源使用限制
    • 超时保护机制

任务参数

参数描述必需/可选
expressionJavaScript 表达式或函数。支持 ES6+ 语法,可以访问工作流变量。必需
evaluatorType脚本评估器类型。目前支持 graaljs(GraalJS 引擎)。可选,默认为 graaljs
inputParameters传递给脚本的输入参数。可以在表达式中通过 $.paramName 访问。可选

内置对象和函数

1. 工作流上下文

  • workflow - 当前工作流实例

    • workflow.workflowId - 工作流ID
    • workflow.input - 工作流输入参数
    • workflow.variables - 工作流变量

2. 任务上下文

  • task - 当前任务实例

    • task.taskId - 任务ID
    • task.referenceTaskName - 任务引用名
    • task.input - 任务输入参数

3. 工具函数

// 日期处理
moment()                    // 当前时间
moment('2024-01-01')       // 解析日期
moment().add(1, 'days')    // 日期计算

// 数学运算
Math.floor(3.14)           // 向下取整
Math.ceil(3.14)            // 向上取整
Math.round(3.14)           // 四舍五入

// 字符串处理
String.prototype.trim()     // 去除空格
String.prototype.split()    // 字符串分割
String.prototype.replace()  // 字符串替换

配置示例

1. 基础表达式

{
  "name": "inline_task",
  "taskReferenceName": "inline_task_ref",
  "type": "INLINE",
  "inputParameters": {
    "value": "${workflow.input.someValue}",
    "expression": "$.value * 2"
  }
}

2. 条件判断

{
  "name": "check_condition",
  "taskReferenceName": "condition_ref",
  "type": "INLINE",
  "inputParameters": {
    "age": "${workflow.input.age}",
    "expression": "if ($.age >= 18) { return 'adult'; } else { return 'minor'; }"
  }
}

3. 数据转换

{
  "name": "transform_data",
  "taskReferenceName": "transform_ref",
  "type": "INLINE",
  "inputParameters": {
    "users": "${workflow.input.users}",
    "expression": "$.users.map(user => ({ 
      id: user.id,
      fullName: `${user.firstName} ${user.lastName}`,
      age: moment().diff(moment(user.birthDate), 'years')
    }))"
  }
}

最佳实践

  1. 代码组织

    • 保持表达式简洁
    • 使用适当的注释
    • 遵循代码风格规范
  2. 错误处理

    • 添加适当的验证
    • 实现错误捕获
    • 提供默认值
  3. 性能优化

    • 避免复杂计算
    • 限制数据量
    • 合理使用缓存

使用限制

  1. 执行环境

    • 不支持异步操作
    • 不能访问外部资源
    • 限制执行时间
  2. 资源限制

    • 内存使用上限
    • CPU 时间限制
    • 代码长度限制
  3. 安全限制

    • 禁止文件操作
    • 禁止网络访问
    • 禁止系统调用

调试技巧

  1. 日志输出

    // 在表达式中使用 console.log
    console.log('Debug:', $.someValue);
  2. 错误追踪

    try {
      // 业务逻辑
    } catch (error) {
      console.error('Error:', error);
      throw error;
    }
  3. 数据验证

    if (!$.requiredValue) {
      throw new Error('Required value is missing');
    }

UI 配置指南

  1. 在工作流编辑器中添加 Inline 任务
  2. 配置输入参数和表达式
  3. 使用内置的代码编辑器
  4. 测试表达式执行结果

常见问题

  1. 表达式执行失败

    • 检查语法错误
    • 验证输入参数
    • 查看执行日志
  2. 性能问题

    • 优化代码逻辑
    • 减少数据处理量
    • 使用缓存机制
  3. 数据类型错误

    • 确保类型匹配
    • 添加类型转换
    • 验证输入数据

示例场景

  1. 数据验证和转换

    // 验证和转换用户输入
    function validateAndTransform(input) {
      if (!input.email) {
     throw new Error('Email is required');
      }
      return {
     email: input.email.toLowerCase(),
     name: input.name || 'Anonymous',
     createdAt: moment().toISOString()
      };
    }
  2. 条件路由

    // 根据条件决定下一步操作
    function determineNextStep(data) {
      if (data.amount > 1000) {
     return 'high_value_process';
      } else if (data.amount > 100) {
     return 'normal_process';
      }
      return 'low_value_process';
    }
  3. 数据聚合

    // 合并多个任务的结果
    function aggregateResults(results) {
        return results.reduce((acc, result) => ({
        total: acc.total + result.value,
        count: acc.count + 1,
        average: (acc.total + result.value) / (acc.count + 1)
        }), { total: 0, count: 0, average: 0 });
    }

飞流云