公司开始上OSB就是Oracle 的ESB产品,有一个很好的功能,可以实时推送消息,又不会对EBS造成太多压力,并且可以避开请求堵塞的情况。就是利用OSB的adapter适配器,订阅EBS的事件,获得消息后在调用对应的EBS程序完成系统数据的传递。
但是限于实施公司的能力做的不太好,在上线后遇到了一些坑,我们发现了一些,还有一些问题没有解决,做一下总结。
做以下记录:
1. 做下业务事件方式集成的开发说明;
2. 对遇到的坑做下说明(持续更新)
1. ERP对数据变更的表建立触发器,如果监控的字段数据发生变更,则调用工作流事件,产生相应的事件,事件中包括事件名称和相关参数;
sysadmin用户登录:系统管理员->工作流->管理员工作流->业务事件,点击“创建事件”
名称规范:参考java的规范,必须唯一
显示名称:对该时间做说明
责任人姓名和标记:我是用的应用的TOP名
完成后店家“创建”,会生成一行业务事件,上面有三个按钮“订阅”、“更新”、”测试“
订阅:一个业务会产生一个订阅
注意:订阅中有一个参数 执行条件->阶段,一般是50,阶段的值小于99事件会实时被adapter调用,大于100以上adapter的监控会有延迟。
更新:对业务事件的设置做更新
测试:可以在界面生成业务事件,快速测试
2. OSB的adapter适配器会秒级监控EBS的业务事件表,发现新的事件之后,获取事件中的参数,包括EBS注册的事件名称和参数;
3. OSB根据获得的事件名确认需要调用EBS的程序包,将业务事件中的参数传递给EBS程序包,获得返回参数(真实的报文),并将返回参数传递给其他系统,完成数据集成;
以上是OSB业务事件的一种集成方法,主要是借用Oracle的高级队列AQ,建立业务事件,通过业务事件触发系统数据集成。这种方法也可以完成其他的需求。
这种集成方式,适合于做单据类数据下发,因为单据产生的频率较低。不适合大批量数据变更的下发,因为一旦有大批量数据变更,鉴于表级的触发器,会产生大量的业务事件,造成ESB的集成事件拥堵。
比如物料表建立触发器,每便跟一行物料数据就建立一个业务事件,如果瞬间更新100W的物料信息,则会瞬间产生100W的集成业务。
查看业务事件的订阅,执行条件->阶段,如果该参数值大于100会延迟,一般改成50
OSB在建立了监听后,会在EBS生成一个订阅者,查询sql为
SELECT *
FROM Aq$wf_Bpel_Qtab_r t WHERE t.RULE LIKE '%gtk.oracle.apps.erp.subinventory.change%';
其中的name字段为订阅者名称,该名称需要与OSB中设定参数一致,才会被OSB获取到。
如果name名称与OSB中设置的不一致,或者根本不存在,则需要在EBS重新注册,代码如下:
DECLARE
Subscriber Sys.Aq$_Agent;
BEGIN
Subscriber := Sys.Aq$_Agent('my name', 'APPS.WF_BPEL_Q', 0);
Dbms_Aqadm.Add_Subscriber('WF_BPEL_Q'
,Subscriber
,'my rule');
COMMIT;
END;
以上代码中,my name需要OSB提供,my rule需要OSB提供
以下是例子
DECLARE
Subscriber Sys.Aq$_Agent;
BEGIN
Subscriber := Sys.Aq$_Agent('ORA_8op3gdpp8cp36da460s3ah216h', 'APPS.WF_BPEL_Q', 0);
Dbms_Aqadm.Add_Subscriber('WF_BPEL_Q'
,Subscriber
,'tab.user_data.event_name = ''gtk.oracle.apps.erp.vendor.change'' AND tab.user_data.getvalueforparameter(''GROUP'') IS NULL');
COMMIT;
END;
参考文档:metalink文档 Doc ID 1954592.1
该表存储数据过大,历史无效数据未被删除,无法直接delete和truncate,具体清理方法还不确定。
考虑dequeue,应该有方法的。持续更新
参考metalink文档:Doc ID 549040.1
查看生成的业务事件
SELECT /*+parallel(t,12)*/ t.State
,t.User_Data.Event_Name
,t.User_Data.Send_Date
,t.User_Data.Event_Key
,t.*
FROM Apps.Wf_Bpel_Qtab t
WHERE 1=1
AND t.User_Data.Event_Name = 'gtk.oracle.apps.erp.subinventory.change' --客户
--AND t.User_Data.Event_Name = 'gtk.oracle.apps.erp.project.change' --项目
--WHERE t.User_Data.Event_Name = 'cux.oracle.apps.wms.sale.order.event'--子库存
AND t.User_Data.Send_Date > To_Date('2023/3/17 14:41:38', 'YYYY-MM-DD HH24:MI:SS')
ORDER BY t.User_Data.Send_Date DESC;
查看队列状态
SELECT Corrid
,Decode(State
,0
,'0 = Ready'
,1
,'1 = Wait'
,2
,'2 = Processed'
,3
,'3 = Exception'
,To_Char(State)) State
,COUNT(*) COUNT
FROM Wf_Deferred
GROUP BY Corrid
,State;
select * from user_queue_tables;--业务时间表
select * from user_queues t WHERE t.name = 'WF_BPEL_Q';--队列
select * from user_queue_subscribers;--订阅者
select * from user_queue_schedules;