环境说明
一Oracle高级消息队列AQ创建消息负荷payload
创建队列表
创建队列并启动
队列的停止和删除
入队消息
出队消息
二Java使用JMS监听并处理Oracle AQ队列创建连接参数类
创建消息转换类
主类进行消息处理
三监控表记录变化通知Java创建表
创建存储过程
创建触发器
环境说明
本实验环境基于Oracle 12C和JDK1.8,其中Oracle 12C支持多租户特性,相较于之前的Oracle版本,使用‘C##用户名‘表示用户,例如如果数据库用户叫kevin,则登陆时使用C##kevin进行登陆。
一、Oracle高级消息队列AQ
Oracle AQ是Oracle中的消息队列,是Oracle中的一种高级应用,每个版本都在不断的加强,使用DBMS_AQ系统包进行相应的操作,是Oracle的默认组件,只要安装了Oracle数据库就可以使用。使用AQ可以在多个Oracle数据库、Oracle与Java、C等系统中进行数据传输。
下面分步骤说明如何创建Oracle AQ
1. 创建消息负荷payload
Oracle AQ中传递的消息被称为有效负荷(payloads),格式可以是用户自定义对象或XMLType或ANYDATA。本例中我们创建一个简单的对象类型用于传递消息。
create type demo_queue_payload_type as object (message varchar2(4000));
2. 创建队列表
队列表用于存储消息,在入队时自动存入表中,出队时自动删除。使用DBMS_AQADM包进行数据表的创建,只需要写表名,同时设置相应的属性。对于队列需要设置multiple_consumers为false,如果使用发布/订阅模式需要设置为true。
begin
dbms_aqadm.create_queue_table(
queue_table => 'demo_queue_table',
queue_payload_type => 'demo_queue_payload_type',
multiple_consumers => false
);
end;
执行完后可以查看oracle表中自动生成了demo_queue_table表,可以查看影响子段(含义比较清晰)。
3. 创建队列并启动
创建队列并启动队列:
begin
dbms_aqadm.create_queue (
queue_name => 'demo_queue',
queue_table => 'demo_queue_table'
);
dbms_aqadm.start_queue(
queue_name => 'demo_queue'
);
end;
至此,我们已经创建了队列有效负荷,队列表和队列。可以查看以下系统创建了哪些相关的对象:
SELECT object_name, object_type FROM user_objects WHERE object_name != 'DEMO_QUEUE_PAYLOAD_TYPE';
OBJECT_NAME OBJECT_TYPE
------------------------------ ---------------
DEMO_QUEUE_TABLE TABLE
SYS_C009392 INDEX
SYS_LOB0000060502C00030$$ LOB
AQ$_DEMO_QUEUE_TABLE_T INDEX
AQ$_DEMO_QUEUE_TABLE_I INDEX
AQ$_DEMO_QUEUE_TABLE_E QUEUE
AQ$DEMO_QUEUE_TABLE VIEW
DEMO_QUEUE QUEUE