Application Engine 中文文档实战指南:从黑匣子到避坑进阶

发布时间:2026/10/21 15:14:45
Application Engine 中文文档实战指南:从黑匣子到避坑进阶
简介这份资源是面向PeopleSoft开发人员与人力系统实施人员的Application Engine中文文档针对英文原版阅读门槛高、术语理解困难的问题提供深度翻译版本帮助中文用户掌握这一核心批处理与业务流程自动化组件。压缩包内共1个PDF文件大小约2.25MB内容源自Enterprise PeopleTools 8.50 PeopleBook涵盖应用引擎概述、实施方法、程序元素栏目、阶梯、行动、Meta-SQL、并发执行、错误恢复、日志记录与性能优化等章节并附有Oracle许可限制、保修声明及危险应用、第三方内容等法律条款说明。目前已有345人学习。读者可借此系统理解Application Engine在批量数据处理、定时任务与模块集成中的运行机制掌握程序步骤定义、控制流与数据源配置、调度与错误处理策略并了解其与PeopleCode、Job、Process Scheduler的协同方式适合作为开发与维护PeopleSoft系统的常备参考。1. Application Engine 中文文档到底在讲什么从一份“黑匣子”到能上手改第一次接触 Application Engine 的人多半是被一段跑不通的批处理逼到墙角日志里只有几行Step status: Error没有堆栈没有行号连是 SQL 报错还是 PeopleCode 抛异常都分不清。Application Engine 中文文档要解决的正是这个“黑匣子”问题——它把 AE 程序的结构、执行顺序、状态码、临时表机制、重启逻辑讲清楚让你能从“看日志猜”变成“按状态定位”。它适合三类人刚接手 PeopleSoft 批处理维护的初级开发、需要把在线逻辑改造成后台作业的顾问、以及被AE_ABEND反复折磨的运维。中文资料稀缺很多人靠英文 PeopleBooks 硬啃这份文档的价值在于把术语和实操对齐让你改一个Do Select的ReUse属性时知道它到底影响什么。2. Application Engine 程序结构Section、Step、Action 三层怎么拆2.1 三层结构不是命名游戏是执行顺序的硬约束Application Engine 程序在 PeopleTools 里被组织成三层Section节、Step步、Action动作。一个 AE 程序至少有一个 SectionSection 下挂若干 StepStep 下挂若干 Action。执行顺序是按 Section 顺序执行Section 内按 Step 顺序执行Step 内按 Action 顺序执行。Action 类型常见的有SQL、PeopleCode、Do Select、Do When、Do While、Call Section、Log Message、Message Box等。很多人第一次写 AE 会把Do Select当成循环体本身其实Do Select是一个 Action它内部再按ReUse或Restart决定是否重新打开游标。理解这一点才能解释为什么改了ReUse之后性能差十倍。2.2 用 PeopleTools 定义一个最小可运行 AE下面是一个最小 AE 的伪代码结构用 PeopleCode 风格描述实际在 Application Designer 里是图形化配置/* Section: MAIN */ /* Step: STEP1 */ /* Action1: SQL */ %Select(EMPLID, NAME) SELECT EMPID, NAME FROM PS_EMPLOYEE WHERE STATUS A %End-Select; /* Action2: PeopleCode */ If %Select(EMPLID) Then /* 这里写业务逻辑比如写日志表 */ SQLExec(INSERT INTO PS_AE_LOG VALUES (:1, :2), EMPLID, NAME); End-If;逻辑说明SQLAction 执行一次查询把结果放入%Select缓冲区PeopleCodeAction 读取缓冲区并做判断。参数说明%Select是 AE 特有的绑定变量不是普通 PeopleCode 变量只能在 AE 的 SQL Action 和 PeopleCode Action 之间传递。ReUse属性在Do Select里控制游标是否复用默认ReUse是ReUse表示每次循环重新打开ReUse设为ReUse时性能更好但要注意状态残留。2.3 临时表Temp Table和重启Restart的配合AE 的临时表分两种Record型临时表和SQL型临时表。Record型临时表在 AE 运行时自动创建实例号程序结束后自动清理SQL型临时表需要手动管理。重启机制依赖State Record它记录每个 Step 的执行状态。如果程序在 Step 3 失败重启时会从 Step 3 开始而不是从头。常见坑是State Record没设对重启后重复执行 Step 1 导致数据翻倍。配置时要在 AE 属性里勾选Restart Enabled并指定State Record为PS_AE_STATE这类记录。3. 用 Application Engine 跑批从建程序到调度的完整路径3.1 在 Application Designer 里新建 AE 程序步骤打开 Application Designer选择File New Application Engine Program输入程序名比如AE_DEMO_BATCH然后右键插入 Section、Step、Action。每个 Action 的类型在属性面板里选。SQL Action 的 SQL 可以直接写也可以用%Select绑定。PeopleCode Action 可以写完整 PeopleCode但注意 AE 里的 PeopleCode 不支持所有在线事件比如RowInit不会触发。3.2 用命令行跑 AE 并看日志AE 可以通过psae命令行工具运行常见命令psae -CT ORACLE -CD DBNAME -CO USER -CP PASSWORD -R INSTANCE -AI AE_DEMO_BATCH -I 1参数说明-CT是数据库类型-CD是数据库名-CO是用户名-CP是密码-R是实例名-AI是 AE 程序名-I是进程实例号。运行后日志在PS_AE_LOG表或$PS_HOME/log目录下。日志里会显示每个 Step 的状态0表示成功1表示失败2表示未执行。如果看到Step status: 1就去查该 Step 的 SQL 或 PeopleCode。3.3 调度 AE用 Process Scheduler 还是自己写脚本常见做法是用 PeopleSoft 的 Process Scheduler 调度配置 Run Control 和 Job。如果只是临时跑用psae命令行更直接。注意Process Scheduler 会检查AE程序的Run Control权限如果用户没有权限调度会失败但日志不明确。自己写脚本时要处理psae的返回码0成功非0失败。返回码在 shell 里用$?获取。4. Application Engine 避坑五个血泪经验4.1 现象程序跑完数据翻倍原因State Record 没配好解决检查 Restart 设置第一次写 AE 时我把Restart Enabled勾上但没指定State Record结果程序失败后重启Step 1 又跑了一遍数据重复插入。解决方法是要么关掉Restart Enabled要么正确配置State Record并在 Step 里用%State记录状态。State Record必须是一个有PROCESS_INSTANCE键的记录AE 会自动维护。4.2 现象Do Select 循环里 PeopleCode 不执行原因ReUse 属性设错解决改成 ReUse 或 RestartDo Select的ReUse属性有三个值ReUse、Restart、ReUse。如果设成Restart每次循环都会重新打开游标导致 PeopleCode 里的%Select变量被重置。我一般设成ReUse但要注意在循环内不要修改%Select的值否则下次循环会读到脏数据。4.3 现象SQL 报错但日志只显示 Error原因SQL 太长被截断解决用 Log Message Action 分段输出AE 的日志对长 SQL 会截断导致看不到具体错误。解决方法是在 SQL Action 前加一个Log MessageAction把关键变量打出来或者把 SQL 拆成多个短 SQL。另外SQLExec在 PeopleCode 里报错会抛异常但 AE 的 PeopleCode Action 默认不捕获异常需要在 PeopleCode 里加try-catch。4.4 现象临时表数据没清理原因SQL 型临时表没手动删解决在程序末尾加 Delete ActionRecord型临时表会自动清理但SQL型临时表不会。我见过一个程序跑了一个月临时表涨到几十万行。解决在 AE 的最后一个 Step 加一个SQLActionDELETE FROM PS_AE_TEMP WHERE PROCESS_INSTANCE %ProcessInstance。%ProcessInstance是 AE 内置变量直接可用。4.5 现象调度失败但命令行能跑原因Run Control 权限或进程实例冲突解决检查权限和实例号Process Scheduler 调度时会检查用户对 Run Control 的权限。如果用户没有权限调度会失败但日志只显示No Run Control。另外如果同一个 AE 程序用同一个实例号并发跑会冲突。解决确保每个调度用不同的-I参数或者用 Process Scheduler 自动分配实例号。5. 进阶用 AE 做数据迁移和批量校验的实战技巧5.1 用 AE 做数据迁移分批次提交和错误隔离数据迁移场景下AE 的优势是能分批次提交避免大事务。我一般会在Do Select里按EMPLID排序每 1000 条提交一次。PeopleCode 里用CommitWork()手动提交。错误隔离的做法是把每条记录的校验结果写入一个日志表最后统一处理失败记录。这样即使中间某条失败也不会影响其他记录。/* 在 Do Select 的 PeopleCode Action 里 */ count count 1; If count % 1000 0 Then CommitWork(); End-If; /* 校验逻辑 */ If salary 0 Then SQLExec(INSERT INTO PS_AE_ERROR_LOG VALUES (:1, :2), EMPLID, Negative salary); End-If;参数说明CommitWork()在 AE 里是允许的但要注意提交后State Record的状态也会被提交重启时可能不一致。建议在迁移场景关掉Restart用CommitWork控制事务。5.2 用 AE 做批量校验把在线逻辑改造成后台作业在线页面上的校验逻辑通常写在FieldChange或SaveEdit里改造成 AE 时要把这些逻辑抽成独立的 PeopleCode 函数然后在 AE 的 PeopleCode Action 里调用。注意在线逻辑可能依赖%Page或%Component变量这些在 AE 里不存在需要替换成%Select或SQLExec查询。我一般会建一个AE_VALIDATE程序按业务模块分 Section每个 Section 对应一个校验规则。5.3 验证 AE 是否跑对三个必查指标跑完 AE 后我习惯查三个地方第一PS_AE_LOG表里该进程实例的STEP_STATUS是否全为0第二目标表的数据量是否和预期一致第三State Record里的PROCESS_INSTANCE是否被正确清理。如果这三个都正常基本可以放心。另外如果 AE 调用了Call Section要检查子 Section 的日志因为子 Section 的失败可能不会直接反映在主 Section 的状态里。5.4 一个具体技巧用 AE 的 Log Message 做性能分析AE 的Log MessageAction 可以输出时间戳。我在每个 Step 前后加Log Message输出%DateTime然后算差值就能定位哪个 Step 最慢。这个技巧比用数据库的 SQL 跟踪更直接因为 AE 的 Step 粒度更细。注意Log Message会写日志表频繁调用会影响性能建议只在调试时开。我做了这么多年 AE最大的教训是不要相信“看起来跑通了”一定要查日志和状态表。有一次我改了一个Do Select的ReUse属性测试环境跑得飞快生产环境直接超时后来发现是数据量大了之后游标复用导致锁竞争。从那以后我改任何 AE 属性都会先在测试环境用生产数据量跑一遍。希望帮到你。本文还有配套的精品资源点击获取