我知道我可以使用 JMS TopicPublisher 从 java 代码将消息发布到给定主题到 Oracle AQ 队列(有大量文档和示例),但我确实需要从 PL/SQL 代码发布消息到给定主题到Qracle AQ 队列。我找不到有关如何执行此操作的文档或示例。可能吗?有人能给我指出正确的文档或样本位置吗???
任何帮助表示赞赏,
扬·范德克洛克
我知道我可以使用 JMS TopicPublisher 从 java 代码将消息发布到给定主题到 Oracle AQ 队列(有大量文档和示例),但我确实需要从 PL/SQL 代码发布消息到给定主题到Qracle AQ 队列。我找不到有关如何执行此操作的文档或示例。可能吗?有人能给我指出正确的文档或样本位置吗???
任何帮助表示赞赏,
扬·范德克洛克
您可以在Streams Advanced Queuing User's Guide中找到所有带有示例的信息
下面的例子是从文档中提取的,有微小的变化
CREATE TYPE message_typ AS object(
sender_id NUMBER,
subject VARCHAR2(30),
text VARCHAR2(1000));
/
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table => 'obj_qtab',
queue_payload_type => 'message_typ',
multiple_consumers => true
);
END;
/
BEGIN
DBMS_AQADM.CREATE_QUEUE(
queue_name => 'obj_queue',
queue_table => 'obj_qtab');
END;
/
BEGIN
DBMS_AQADM.START_QUEUE (
queue_name => 'obj_queue');
END;
/
DECLARE
subscriber sys.aq$_agent;
BEGIN
subscriber := sys.aq$_agent('RED', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'obj_queue',
subscriber => subscriber);
subscriber := sys.aq$_agent('GREEN', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'obj_queue',
subscriber => subscriber);
subscriber := sys.aq$_agent('YELLOW', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'obj_queue',
subscriber => subscriber);
END;
/
脚本会创建对象、创建队列表、创建队列、启动队列并注册 3 个订阅者。
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
recipients DBMS_AQ.aq$_recipient_list_t;
message_handle RAW(16);
message message_typ;
recipients2 DBMS_AQ.aq$_recipient_list_t;
BEGIN
message := message_typ(001, 'MESSAGE 1','For queue subscribers');
DBMS_AQ.ENQUEUE(
queue_name => 'obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
-- Message for all subscriber
message := message_typ(001, 'MESSAGE 2', 'For two recipients');
recipients(1) := sys.aq$_agent('RED', NULL, NULL);
recipients(2) := sys.aq$_agent('BLUE', NULL, NULL);
message_properties.recipient_list := recipients;
DBMS_AQ.ENQUEUE(
queue_name => 'obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
-- Message for RED,BLUE subscriber
recipients2(1) := sys.aq$_agent('RED', NULL, NULL);
message := message_typ(001, 'MESSAGE 3', 'For RED Subscriber');
message_properties.recipient_list := recipients2;
DBMS_AQ.ENQUEUE(
queue_name => 'obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
-- Message for RED subscriber
COMMIT;
END;
/
要检查结果,您必须查询队列表视图 ( AQ$queue_table_name
)。
在这种情况下是。
select o.user_data,CONSUMER_NAME from AQ$obj_qtab o order by MSG_ID;