在新克隆的应用环境中启用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