在 Oracle 数据库上创建 jms 映射消息时出现异常

Exception on creating a jms map message on the Oracle database

我正在尝试创建映射类型的 JMS 消息并将其加入队列。 但是这样做时我收到以下错误

ORA-29516: Aurora assertion failure: Assertion failure at eox.c:359
Uncaught exception Root of all Java exceptions: java.lang.UnsatisfiedLinkError sun.net.PortConfig.getLower0 
ORA-06512: at "SYS.DBMS_JMS_PLSQL", line 498
ORA-06512: at "SYS.AQ$_JMS_MAP_MESSAGE", line 79
ORA-06512: at line 20
29516. 00000 -  "Aurora assertion failure: %s"
*Cause:    An internal error occurred in the Aurora module.
*Action:   Contact Oracle Worldwide Support.

我正在使用的 SQL 看起来像这样

DECLARE
  v_id                  pls_integer;
  v_msg                 sys.aq$_jms_map_message;
  v_msg_agent           sys.aq$_agent;
  v_msg_proparray       sys.aq$_jms_userproparray;
  v_msg_property        sys.aq$_jms_userproperty;
  v_msg_header          sys.aq$_jms_header;
  v_enqueue_options     dbms_aq.enqueue_options_t;
  v_msg_properties      dbms_aq.message_properties_t;
  v_msgid               raw(16);
BEGIN
  v_msg_agent := SYS.AQ$_AGENT(' ', NULL, 0);
  v_msg_proparray := SYS.AQ$_JMS_USERPROPARRAY();
  v_msg_proparray.EXTEND(1);
  v_msg_property := SYS.AQ$_JMS_USERPROPERTY('JMS_OracleDeliveryMode', 100, '2', NULL, 27);
  v_msg_proparray(1) := v_msg_property;
  v_msg_header := SYS.AQ$_JMS_HEADER(v_msg_agent,NULL,'<USERNAME>',NULL,NULL,NULL,v_msg_proparray);
  v_msg := sys.aq$_jms_map_message(v_msg_header,NULL,NULL,NULL);
  v_id := v_msg.clear_body(-1);

  v_msg.set_string(v_id, 'STRING', 'Test');

  v_msg.flush(v_id);
  v_msg.clean(v_id);
  dbms_aq.enqueue(queue_name => 'SEND_QUEUE',
                enqueue_options => v_enqueue_options,
                message_properties => v_msg_properties,
                payload => v_msg,
                msgid => v_msgid);
END;

问题似乎是由 v_id := v_msg.clear_body(-1); 调用引起的。 我不知道如何解决这个问题,因为相同的配置确实适用于文本消息类型。但这不使用 id 参数(所以我不需要调用 clear_body)。

v_msg := sys.aq$_jms_text_message(v_msg_header,NULL,NULL,NULL);
v_msg.text_vc  := 'test';
v_msg.text_len := LENGTH(v_msg.text_vc);

至于我的队列配置,我使用以下设置

DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'PRODUCER_QUEUES', multiple_consumers=>TRUE, queue_payload_type=>'SYS.AQ$_JMS_MAP_MESSAGE');
DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'CONSUMER_QUEUES', multiple_consumers=>FALSE, queue_payload_type=>'SYS.AQ$_JMS_MAP_MESSAGE');

DBMS_AQADM.CREATE_QUEUE(queue_name => 'SEND_QUEUE', queue_table => 'PRODUCER_QUEUES');
DBMS_AQADM.CREATE_QUEUE(queue_name => 'RECEIVE_QUEUE', queue_table => 'CONSUMER_QUEUES');

DBMS_AQADM.START_QUEUE(queue_name => 'SEND_QUEUE');
DBMS_AQADM.START_QUEUE(queue_name => 'RECEIVE_QUEUE');

DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'SEND_QUEUE', subscriber => sys.aq$_agent(NULL, 'RECEIVE_QUEUE', NULL));

DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name => 'SEND_QUEUE', latency => 0);

谁能告诉我是什么导致了这个异常?
提前致谢。

我前段时间修复了这个问题,比较简单。 事实证明,构建新消息不需要调用 clear_body。根据文档,这很明显,您可以用它来重建消息 body 而无需清除任何 header 值。

Documentation for more information

我还将消息类型切换为 JMS_TEXT_MESSAGE,因为它更符合我的需要。