3. BES Tables
2, dba_queues
这是一张基本表, 包含了数据库中所有queue的定义,
示例
select * from dba_queues where name = 'WF_DEFERRED' and
OWNER = 'APPLSYS'
3, wf_agents
Agent定义表, 通过SYSTEM_GUID字段与WF_SYSTEMS
表进行关联, 示例:
select * from wf_agents where NAME in
('WF_DEFERRED', 'WF_JAVA_DEFERRED')
字段:
GUID, NAME, SYSTEM_GUID, QUEUE_HANDLER,
QUEUE_NAME, STATUS
4. BES Tables
4, wf_event_groups
业务事件组, 在WAP/Events页面可以进行定义.
5, wf_events
业务事件定义表, 示例:
select * from wf_events where name = 'oracle.apps.gmd.leavereq'
字段: GUID, NAME, STATUS, owner_name, owner_tag,
generate_function, java_generate_function
6, wf_deferred
这是一张AQ表, 如果使用plsql触发的业务事件订阅是deferred的,
那么业务事件将会记录在这张表. 字段:
Q_NAME, CORRID, STATE, ENQ_TIME, DEQ_TIME, EVENT_NAME,
EVENT_KEY, EVENT_DATA, 示例:
select * from wf_deferred where corrid like
'%oracle.apps.gmd.leavereq' order by enq_time desc
7. BES API
- wf_event
• BES API主要分为两个部分, 业务事件API和规则函数(Rule Function), 前者
用于业务事件的操作, 比如触发业务事件,主要由PLSQL包wf_event组成;
后者则用于实现业务事件订阅的操作, 系统提供了默认的规则函数
(wf_rule包), 用户也可以自定义规则函数.
• wf_event
1, raise
触发一个业务事件, 如下:
PROCEDURE raise(p_event_name in varchar2,
p_event_key in varchar2,
p_event_data in clob,
p_parameters in wf_parameter_list_t,
p_send_date in date)
2, send
将一个业务事件从一个代理发送到另一个代理, 如下:
PROCEDURE send(p_event in out nocopy wf_event_t)
8. BES API
- wf_event
3, newAgent
根据代理的GUID, 返回该代理的wf_agent_t数据, 如下:
function NewAgent (p_agent_guid in raw) return
wf_agent_t;
4, Test
查询指定业务事件是否被创建, 以及订阅情况. 如下:
function Test (p_event_name in varchar2)
return varchar2;
返回值有可能是:
NONE 业务事件不存在或者没有任何订阅
KEY 业务事件相关订阅只要求KEY数据
MESSAGE 业务事件至少一个相关的订阅只要求
MESSAGE数据
9. BES API
- wf_event
5, Enqueue
事件入队, 如下:
procedure Enqueue (p_event in wf_event_t, p_out_agent_override in
wf_agent_t default null);
6, Listen
监听指定的代理, 对入队的消息进行dequeue操作. 如下:
procedure Listen (p_agent_name in varchar2,...
7, AddParameterToList
添加参数到参数列表, 如下:
procedure AddParameterToList (p_name in varchar2,
p_value in varchar2,
p_parameterlist in out wf_parameter_list_t);
类似的过程有AddParameterToListPos
10. BES API
- wf_event example
• 示例使用wf_event触发一个业务事件:
declare
l_event_name varchar2(50) := 'oracle.apps.gmd.leavereq';
l_event_key varchar2(50) := '330';
begin
-- Raise the event
WF_EVENT.Raise(p_event_name => l_event_name,
p_event_key => l_event_key);
commit;
end;
/
上面使用wf_event.raise触发了一个业务事件,
调用该API之后需要进行commit操作.
11. BES API
- wf_event & event data generator
8, GetValueForParameter
从参数列表中去某个参数的值, 如下:
function GetValueForParameter (p_name in varchar2,
p_parameterlist in wf_parameter_list_t) return varchar2;
类似的函数有GetValueForParameterPos.
关于业务事件还有一个比较重要的方面是事件数据的生
成函数, 在业务事件的定义界面可以指定PLSQL或者JAVA
形式的生成函数, 这里介绍PLSQL形式的生成函数. 函数必
须遵循如下API格式:
function <function_name>
(p_event_name in varchar2,
p_event_key in varchar2,
p_parameter_list in wf_parameter_list_t default null)
return clob;
12. BES API
- wf_rule
• wf_rule
规则函数用于实现业务
事件订阅指定的操作, 比
如启动工作流, 发送通知
等; 在查看业务事件订阅
的界面可以看到规则函数的身影.
Oracle Workflow定义了如下标准规则函数:
1, default_rule
执行默认的事件订阅操作, 包含:
– 将业务事件消息发送给工作流;
– 将业务事件发送到另一个agent.
该函数的返回值为SUCCESS或者ERROR, 如果出现错误业务事件
将会进入WF_ERROR代理. 函数的定义如下:
FUNCTION default_rule(p_subscription_guid in raw,
p_event in out nocopy wf_event_t) return varchar2
13. BES API
- wf_rule
2, error_rule
与default_rule类型, 但是当处理过程中出现错误
时, 它会返回SUCCESS并且事件不会进入WF_ERROR
代理.
3, SendNotification
发送工作流之外的通知, 需要在事件参数中指定
RECIPIENT_ROLE, MESSAGE_TYPE, MESSAGE_NAME等
参数, 定义:
function SendNotification (p_subscription_guid in raw,
p_event in out wf_event_t) return varchar2;
在定义订阅的动作为发送通知时, 将会使用这个规
则函数.
14. BES API
- Customized Rule Function
• 在某些情况下系统预定义的规则函数不能
满足需求, 则可以自定义规则函数, 但必须满
足以下API标准:
function <function_name>
(p_subscription_guid in raw,
p_event in out wf_event_t) return varchar2;
通常情况下这种需求比较少见.