在新克隆的应用环境中启用Workflow Deferred Agent Listener总是错误,错误信息为:
[Feb 12, 2009 3:34:45 PM CST]:1234424085866:Thread[inboundThreadGroup1,5,inboundThreadGroup]:0:-1:test.domain.com.cn:10.0.0.2:-1:-1:ERROR:[SVC-GSM-WFALSNRSVC-12681-10002 : oracle.apps.fnd.wf.bes.AgentListenerProcessor.read()]:Could not executeUpdate() on { CALL WF_EVENT.LISTEN ( p_agent_name => :1, p_wait => :2, p_correlation => :3, p_deq_condition => null, p_message_count => :4, p_max_error_count => :5 )} -> java.sql.SQLException: ORA-00600: internal error code, arguments: [kwqidrdq: loop], [0], [0], [0], [0], [], [], []
ORA-06512: at "APPS.WF_EVENT", line 1560
ORA-06512: at line 1
检查Alert,日志显示:
Thu Feb 12 16:09:55 2009
Errors in file /u08/code/dev/proddb/9.2.0/admin/DEV_test/udump/dev_ora_9675.trc:
ORA-00600: internal error code, arguments: [kwqidrdq: loop], [0], [0], [0], [0], [], [], []
通过pfiles查看9675进程,是oracleDEV,确定不是第三方程序引起的。这个错误的产生通常和AQ相关,而WF_DEFERRED正是基于AQ的,这样问题范围就缩小了。
解决步骤如下:
1. 用sysdba权限登录,停用AQ Time Managers:
alter system set aq_tm_processes = 0
2. 检查相应的QUEUE_TABLE:
SELECT * FROM applsys.aq$_wf_deferred_i i
WHERE NOT EXISTS
(SELECT t.msgid FROM applsys.wf_deferred t WHERE i.msgid = t.msgid);
SELECT * FROM applsys.aq$_wf_deferred_h h
WHERE NOT EXISTS
(SELECT t.msgid FROM applsys.wf_deferred t WHERE h.msgid = t.msgid);
SELECT * FROM applsys.aq$_wf_deferred_t ti
WHERE NOT EXISTS
(SELECT t.msgid FROM applsys.wf_deferred t WHERE ti.msgid = t.msgid);
如果存在记录,则删除之。
3. 重启AQ Time Managers:
alter system set aq_tm_processes = 1
问题解决。还有一种更简单的方式,就是重建QUEUE_TABLE,不过这需要在不丢失数据的前提下。
Ref Metalink: 1070715.6