APP下载

基于存储过程和HTTP协议的消息主动推送系统实现

2016-12-12夏凌云龚文涛

微型电脑应用 2016年11期
关键词:轮询触发器调用

夏凌云,龚文涛

基于存储过程和HTTP协议的消息主动推送系统实现

夏凌云,龚文涛

数据库中的存储过程和触发器多用于数据完整性检测和复杂规则约束,其提供了一个当数据表数据发生变更后的主动操作机制,Oracle数据库还提供了UTL_HTTP包来实现数据库对外部WEB服务器的主动访问。利用这两个特性,可以在数据发生变化的时候主动地将变化内容及时传输给外部业务服务器,再通过业务服务器发送给相应的业务人员,以此避免外部业务系统主动和频繁读取数据库服务器,提高系统消息发送效率,降低系统查询负担。

存储过程;触发器;消息推送;Oracle;UTL_HTTP

0 引言

随着高校信息化建设发展和个人智能终端越来越普及,移动化学习和办公逐渐成为趋势,需要向师生用户的移动终端主动推送消息或提醒的应用和场景也越来越多。在以往的使用过程中,主动推送的消息一般采用应用内推送的方式,在各个业务系统的APP端独立推送,以保证推送的及时性。但是随着高校信息化建设情况的发展,这种模式也显现出了一些弊端,主要是需要推送消息的 APP会越来越多,用户安装起来比较复杂和混乱,也不符合统一门户和入口的高校信息化移动建设要求。

现在很多高校比较常用的是将一些应用和消息推送功能统一集成到微信公众平台或者QQ公众平台上,通过这些公共平台进行校园信息化功能的消息推送和用户交互。使用这样的第三方独立平台来进行消息推送在解决了老问题的时候又带来了新问题,由于校内的信息化系统消息接口并不统一,致使第三方公共平台的后台服务器很多情况下不得不对各个系统消息接口进行定时轮询,以确定是否有新消息和发送目标。而每个系统需要推送的消息、目标用户往往非常多,消息也往往不是内容完全相同的群发消息。在这种情况下对每个业务系统的轮询将消耗后台服务器和业务系统服务器太多的资源,给整个校园信息化系统带来很大的负担。经过不断探索,我们发现采用数据库自带的存储过程和高级接口,并结合通用HTTP协议来实现消息的主动推送,在用来替代轮询过程和减轻系统负担上有着很好的效果。

1 存储过程和触发器

存储过程是一种重要的数据库对象,一般由SQL语句组合而成,具有在存储过程中声明和设置的SQL变量、实现流程控制、处理异常,能够对数据进行更新、读取和删除操作并返回结果集的功能[1]。一般来说,SQL语句每次提交执行一次就需要编译一次,而存储过程在创造时经过一次编译后,可以将编译结果保存在数据库中以便反复调用,因此具有较高的执行效率。同时,存储过程还可以降低整个应用程序的复杂性,具有可移植性、重用性、安全性和伸缩性等特性。因此,使用存储过程操作数据库可以有效地提高数据

库应用的实现效率[2]。

触发器是一种特殊类型的存储过程,顾名思义,它是由某个数据库事件的发生而被自动隐式调用的一种存储过程。除了在一些数据库系统事件里触发的系统触发器,数据库系统中最常用的是DML(Data Manipulation Language 数据操控语言)触发器,在我们的消息主动推送系统实现中采用的也是DML触发器。触发器主要由触发对象、触发事件、触发事件和触发频率等等元素组成,细节如图1所示:

图1 触发器组成

我们可以这样简要地理解触发器工作过程:在数据库中编译成功并保存的触发器,会一直监测着其设置的触发对象(某个表、视图或其它数据库对象),当在该对象上发生指定的触发事件(数据插入、 更新、删除或其它数据库事务)时,将在该触发事件被执行前或执行后(由触发时机指定),以指定的触发频率(语句级:每句SQL指令调用一次;行级:每影响一行数据调用一次)来执行触发器中所设置的一系列指令操作。

2 系统总体设计

总体设计如图2所示:

图2 系统总体设计

从上所述我们可以看出,触发器可以由一个数据库事件启动,在某个具体的数据库事件发生时自动后台运行。结合我们的需求,当我们需要主动提醒的数据每次插入到数据表中的同时,我们都可以利用触发器在数据库中触发一系列指定操作的运行,现在的问题就是如何使这一系列触发操作能传递到数据库外部的其它服务器中。以Oracle数据库软件为例,其提供了 UTL_HTTP包[3],用以实现数据库事务对外部WEB服务器的HTTP访问与互联。

编写一个行触发器监视通知提醒数据表,当每有一行新通知插入到该表的时候,触发器被触发并调用预先编译好的存储过程,使用UTL_HTTP包将具体消息发送到外部WEB服务器,外部服务器接收到消息后再对用户进行相应的消息具体推送。可以看出,在如此设计思路充分利用了数据库的触发器机制,外部服务器再不需要对数据库进行定时轮询,在大大降低了双边系统的负载的同时,还消除了轮询时间间隔,使消息推送更加的及时。

3 系统实现

在这里我们以实现将校园门户中的待办事项提醒推送到微信企业号的通知消息中为例,介绍整个流程的具体实现方法。假设所有用户的新增待办事项都被业务系统插入到数字校园公共数据库用户CORE_iUPC的TODO_INFO表中,我们需要通过行触发器调用一段存储过程,将该插入数据的具体内容(代办人员和待办事项)通过HTTP协议主动推送到微信企业号后台服务器。本系统示例中的数据库软件为Oracle 11g RAC,存储过程和触发器[4]采用PL/SQL编写[5],HTTP端代码采用C#编写,使用IIS7.0发布WEB服务。

3.1 触发器设计触发器的PL/SQL的代码如下,具体含义见注释:

3.2 存储过程设计

存储过程SendNotice的代码如下,该存储过程的重点是在调用oracle所提供的utl_http包来访问HTTP服务,赋予该存储过程HTTP Client的角色和功能,具体含义见注释:

在这里为了简要演示UTL_HTTP的调用方法,我们使用其来调用HTTP_GET方法来向外部服务器发送信息,将相关变量组合成GET页面的URL参数部分进行发送,这样的实现方法比较简单易懂。不过在参数较多或者参数比较复杂的情况下,利用URL传递参数的方法可能不太适用,我们还是推荐使用HTTP_POST方法来发送数据,将所有参数打包成一个XML或者JSON格式的数据,通过POST方法把数据发送到对方服务器。POST方法对所传参数的长度和格式一般没有限制,也基本不会有特殊字符冲突处理问题。

3.3 HTTP接收消息和对外推送

为了便于接收从数据库推送来的消息并同时往微信企业号推送,我们直接在微信企业号的后台创建了上述UTL_HTTP包所指定的接受推送页面sendnotice.aspx,在接收到参数后调用微信企业号的后台消息发送功能,往指定人员的微信推送相应通知信息。后台Web服务器由IIS7.0搭建,代码用C#编写,在Page_Load时运行的有关代码片段如下:

其中往微信企业号内用户发送通知消息的iUPC_Notice类具体实现的是与微信企业号公众平台所对接的相关标准[6],具体内容参见腾讯公司发布的企业号使用文档,该文档描述了后台服务器与微信企业号之间的接口规范和调用流程等等细节,在此不再累述。

4 Oracle 11 g相关权限和安全设置

从数据安全角度来说,在数据库软件中主动调用HTTP协议访问外部站点是一个高危动作,因此Oracle对内部用户是否能发起对外HTTP连接做了严格的限制。在以前的版本是控制某用户对 UTL相关网络访问包(UTL_HTTP、UTL_MAIL、UTL_TCP等等)的调用权限,而在Oracle 11g版本中进行了更高细粒度的ACL(Access Control List,访问控制列表)限制。在PL/SQL下配置用户“test”访问某个IP地址80端口的ACL的具体方法如下:

DBMS_NETWORK_ACL_ADMIN包用于创建、管理、修改和删除ACL,其中的create_acl方法用于创建一条ACL,如果这条 ACL还需要指定给其他用户使用,还可以利用add_privilege 方法进行添加用户,assign_acl方法用于对某条ACL及其用户分配网络访问权限,指定其可以访问的主机和端口,其中host变量可以是IP地址或者域名,也可以使用通配符匹配一段网段。同时也可以多次调用 assign_acl为同一个ACL和其所含用户授权访问多个host主机和端口号。

5 总结

在本文中我们利用存储过程和触发器,在数据表发生变化时主动调用UTL_HTTP包访问数据库服务器外部的网站,并通过HTTP协议传递出相关内容,使消息可以第一时间发送到微信客户端,避免了轮询过程对双方系统的额外开销。该方法还是个非常适用于通过 POST方法将格式数据发送到通信运营商所提供的短信发送接口,实现全自动的短信提醒功能。除了 UTL_HTTP包外,Oracle 11g还提供了UTL_TCP、UTL_MAIL来实现数据库对外的socket连接功能和对外发送邮件功能,同样可以实现本文类似的主动推送功能。另外Microsoft SQL Server和其它主流数据库软件均具有类似的存储过程、触发器和HTTP访问机制,有待大家参考和利用。

[1] 马洪江,周相兵.基于存储过程的科研绩效统计分析系统的实现[J].计算机技术与发展, 2011,21(8)181-184.

[2] 郭绍忠,甄涛,贾琦.基于存储过程的海量邮件数据挖掘[J].计算机工程, 2010,36(1):40-42.

[3] Database PL/SQL Packages and Types Reference. Chapter 225 UTL_HTTP[EB/OL].[2016-03-02],http://docs.oracle. com/cd/E11882_01/appdev.112/e40758/u_http.htm#ARPL S070.

[4] 林树泽, 卢芬, 柳冬青. Oracle DBA高可用、备份恢复与性能优化[M].北京:清华大学出版社,2015.

[5] Michael McLaughli.Oracle Database 11g PL/SQL程序设计 [M].张云,等译.北京:清华大学出版社,2009.

[6] 微信公众平台企业号接口文档[EB/OL].[2016-03-02] http://qydev. weixin.qq.com/wiki/.

Implementation of Message Push System Based on the Stored Procedure and HTTP Protocol

Xia Lingyun, Gong Wentao
(Internet and Education Technology Center, China University of Petroleum (East China), Qingdao 266580, China)

Stored procedures and triggers in database are formerly used for data integrity checking and complex rule restriction, they also provide an actively operating mechanism when the data change in the database table. Oracle Database also provides UTL_HTTP package to achieve the access from database to external WEB server. Using these two characteristics, it can send the changing data to an external service server initiatively and promptly, and then sends the message to the appropriate user through the service server. Thereby avoiding external service systems avoid frequent reading the database server initiatively, it improves messaging system efficiency and reduces the burden on system queries

Stored procedure; Trigger; Message push; Oracle; UTL_HTTP

TP393

A

1007-757X(2016)11-0066-03

2016.07.06)

夏凌云(1980-)男,泸州人,中国石油大学(华东),网络及教育技术中心,硕士研究生,工程师,研究方向:互联网技术、计算机软

硬件技术和物联网技术,青岛 266580

龚文涛(1984-)男,潜江人,中国石油大学(华东),网络及教育技术中心,硕士,工程师,研究方向:网络信息安全,青岛 266580

猜你喜欢

轮询触发器调用
浅谈时序逻辑电路的成长记忆
核电项目物项调用管理的应用研究
基于等概率的ASON业务授权设计∗
使用触发器,强化安全性
基于系统调用的恶意软件检测技术研究
依托站点状态的两级轮询控制系统时延特性分析
利用时间轮询方式操作DDR3实现多模式下数据重排
利用RFC技术实现SAP系统接口通信
几种常见触发器工作方式的讨论
触发器逻辑功能转换的两种方法