在用Workflow Builder绘制工作流的时候,说简单点就是做两件事:定义Activity(活动)和Transition(移动)。Activity可以是复杂的逻辑运算,也可以是简单的判断、通知和反馈。对于需要回应的活动(比如审批意见),因为各种因素可能令响应者并未在预想的时间内做出反馈,这时就需要制定超时策略,否则,随着时间的推移,系统中将存在大量的遗留数据,这些数据很可能无法被清理。
例子:如果一天内未审批,则视为拒绝:

如果活动超时,工作流会标识该活动为超时状态。如果是通知,并且要求回应,则会发送一封取消通知的邮件给执行者(Performer)。对于是否接收取消通知邮件,取决于个人首选项是否选择接收电子邮件。如果是EBS内置版本,则可以在全局设置中禁止发送取消通知邮件。
如果活动定义了超时属性但是没有Timeout这个Transition流向下面的活动,则系统会根据该活动或父流程的相关定义来触发错误流程。对于超时处理,必须启动工作流后台流程,一个建议的频率是1到24小时。
对于Oracle工作流的优化方式主要分两大类,一类是流程设计上的优化,一类是数据库性能的优化。
流程设计优化:
- 仔细选择同步处理和异步处理模式。
如果选择同步处理模式,则在提交后系统立即进行工作流处理,在流程结束前,前端程序将一直处于等待状态。如果选择异步处理模式,程序提交工作流后控制权立即返回,工作流后台引擎会根据设定的频率在后台进行处理。另外一种很少用到的处理模式是强制同步,系统不将数据插入数据库,直接用一个SQL,并且在一个Session中处理完毕。
- 尽量减少项目属性(通常用于存储全局变量)。当工作流启动时,系统会将这些属性全部拷贝一份,因而这会直接印影响工作流启动速度。另外,这些属性最好引用或保存静态变量,而不要去引用存放在数据库中的值。
- 尽量减少消息属性。如果需要在消息中存放不同的变量,也建议用最少的消息属性来实现,比如用Document来动态生成消息内容。
- 减少子流程,因为这需要消耗额外的DML操作和状态信息拷贝。
- 延迟活动。这是缩短响应时间最简单有效的办法之一,让一些需要较多处理时间的活动在后台交给工作流引擎处理,主流程则继续。
数据库性能优化:
- 分区。这通常在安装阶段即可进行,当然,在后期也可以进行。操作步骤可参考之前的文章《给工作流大表分区》。
- 清理过期数据。清理过期的运行时数据和WF_CONTROL数据,减少数据表大小。
最简单的优化方式,自然是在DB进行优化,比如定期清理。但是从设计角度考虑,同步、异步和延迟处理的配合使用,是更为得体的方式。各种方式,因时而异,因人而异。
我所有的工作经历都多少和Oracle有关,但是缺乏SAP的实施经验。他山之石可以攻玉,因而,我在家里启动了为期不定的SAP体验计划。我想要了解SAP的基本架构和功能,当然,也包括简单地学习一下它的整套设计思想。
我希望这个学习计划能对我本身的Oracle领域的工作有所帮助。今年的博客(实际上也就最后一个月时间了),除了工作流,估计是不会再写其他方面的内容了。
祝自己学习愉快!
如果打过了Patch 348000 (ORACLE APPLICATIONS RELEASE 11.5.10.2 MAINTENANCE PACK),那么工作流管理员指南(115wfag.pdf)里的对于关键表分区的介绍就过时了。进去看wfupartb.sql,你可以看到它提示已经被新的程序所取代。
新的文件是wfpart.sql,在 $FND_TOP/patch/115/sql 路径下。参考SQL文件头的使用说明执行,会在utl_file_dir目录(需要手工指定一个目录)下生成wfpart.sql,这才是具体的分区创建语句。不过需要留意的是,默认生成的wfpart.sql有个BUG(参见Note:329738.1),创建WF_ITEM_ACTIVITY_STATUSES_N4这个索引时会报错并自动终止退出,因此需要先手工修改wfpart.sql,加上以下Index创建语句:
create index WF_ITEM_ACTIVITY_STATUSES_N4
on WF_ITEM_ACTIVITY_STATUSES (ASSIGNED_USER,ITEM_TYPE)
pctfree 10
initrans 10
tablespace [your_table_space]
storage (initial 40K next 1048576
freelists 32 freelist groups 4
pctincrease 0 )
logging;
注意:需要注释掉原来的Alter语句:
alter index WFN_WF_ITEM_ACTIVITY_STATUSES_ rename to WF_ITEM_ACTIVITY_STATUSES_N4
由于执行的都是DDL语句,因此一旦出错将无法自动回滚,在执行前需要备份关键表,分别为:
- WF_ITEM_ACTIVITY_STATUSES
- WF_ITEM_ACTIVITY_STATUSES_H
- WF_ITEM_ATTRIBUTE_VALUES
- WF_ITEMS
如果是在等到感觉到性能问题了再来进行分区,等待的过程将相当漫长……如果想要撤销分区,则以同样方式执行wfunpart.sql。
如何获得技术组件(如Forms, iAS, JDK, OAF等)版本信息呢?
用APPL<UID>登录应用所在系统,执行如下命令:
perl $FND_TOP/patch/115/bin/TXKScript.pl \
-script=$FND_TOP/patch/115/bin/txkInventory.pl \
-txktop=$APPLTMP \
-contextfile=$CONTEXT_FILE \
-appspass=appspwd \
-outfile=Report_Inventory.html
各参数:
- txktop 临时工作目录。
- contextfile 元数据存放地址,XML文件。可以使用默认值。
- appspass APPS账号的密码。
- outfile 输出文件位置。
当EBS跑了三年后,我们开始意识到自己遇到了一些瓶颈:非常低的响应时间,越来越慢的备份,考虑对存储进行扩容,尤其是,在应用新的Patch时我们开始学会等待——因为备份和克隆需要耗费大量时间。但是对于一套信息管理系统而言,里面的数据就是企业的财富和宝贵的资源,很多时候,我们需要能够追溯每一笔数据的来龙去脉,因此它们必须,并且永远呆在原来的位置。但是作为信息管理部员工,我们又不得不面对这个即将变得严峻的课题:如何控制数据的增长?
Oracle提供的解决方案认为主要可以分为两类解决办法:
1,增长控制。采用EBS标准的存档/清除程序,或者采用数据库压缩的办法。
2,数据管理。数据库分区,信息生命周期管理。
不过基于办公室政治和风险的考虑,我们往往更乐意将这部分工作外包
相关资源:
- Steven Chan 的博客
- Reducing Your Oracle E-Business Suite Data Footprint using Archiving, Purging, and Information Lifecycle Management(Metalink Note 752322.1)