在 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,因为它更符合我的需要。
我正在尝试创建映射类型的 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,因为它更符合我的需要。