设为首页 加入收藏

TOP

通过JMS监听Oracle AQ,在数据库变化时触发执行Java程序
2015-11-13 01:24:23 来源: 作者: 【 】 浏览:21
Tags:通过 JMS 监听 Oracle 数据库 变化 触发 执行 Java 程序

下面分步骤说明如何创建Oracle AQ


Oracle AQ中传递的消息被称为有效负荷(payloads),格式可以是用户自定义对象或XMLType或ANYDATA。本例中我们创建一个简单的对象类型用于传递消息。


队列表用于存储消息,在入队时自动存入表中,出队时自动删除。使用DBMS_AQADM包进行数据表的创建,只需要写表名,同时设置相应的属性。对于队列需要设置multiple_consumers为false,如果使用发布/订阅模式需要设置为true。


执行完后可以查看oracle表中自动生成了demo_queue_table表,可以查看影响子段(含义比较清晰)。


创建队列并启动队列:


至此,我们已经创建了队列有效负荷,队列表和队列。可以查看以下系统创建了哪些相关的对象:


我们看到一个队列带出了一系列自动生成对象,有些是被后面直接用到的。不过有趣的是,创建了第二个队列。这就是所谓的异常队列(exception queue)。如果AQ无法从我们的队列接收消息,将记录在该异常队列中。


如果需要删除或重建可以使用下面的方法进行操作:


入列操作是一个基本的事务操作(就像往队列表Insert),因此我们需要提交。


通过SQL语句查看消息是否正常入队:


使用Oracle进行出队操作,我没有实验成功(不确定是否和DBMS_OUTPUT的执行权限有关),代码如下,读者可以进行调试:


Java使用JMS进行相应的处理,需要使用Oracle提供的jar,在Oracle安装目录可以找到:在linux中可以使用find命令进行查找,例如


需要的jar为:


实际使用时可以把参数信息配置在properties文件中,使用Spring进行注入。


因为消息载荷是Oracle数据类型,需要提供一个转换工厂类将Oracle类型转换为Java类型。


使用Oracle程序块进行入队操作,在没有启动Java时看到队列表中存在数据。启动Java后,控制台正确的输出的消息;通过Oracle程序块再次写入消息,发现控制台正确处理消息。Java的JMS监听不是立刻进行处理,可能存在几秒中的时间差,时间不等。


创建student表,包含username和age两个子段,其中username时varchar2类型,age时number类型。


创建send_aq_msg存储过程,因为存储过程中调用dbms数据包,系统包在存储过程中执行需要进行授权(使用sys用户进行授权):


注意存储过程中包含commit语句。


在student表中创建触发器,当数据写入或更新时,如果age=18,则进行入队操作。需要调用存储过程发送消息,但触发器中不能包含事物提交语句,因此需要使用pragma autonomous_transaction;声明自由事物:


创建完触发器后向执行插入或更新操作:


Java JMS可以正确的处理消息。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySQL优化order by导致的 using f.. 下一篇CentOS 6.6安装Oralce 11gR2数据库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: