- 1 -
中国科技论文在线
基于 JMS 的订单后督系统的设计与实现#
匡荣杰,杨恢东**
基金项目:广东省自然基金( )
作者简介:匡荣杰,(1988-),男,硕士,主要研究方向:通信与信息系统。
通信联系人:杨恢东,(1967-),男,教授,主要研究方向:半导体材料及集成电路。
(暨南大学信息科学技术学院,广州 510632)
摘要:订单后督系统主要是对后台 MySQL 数据库中的订单进行校验工作,通过对比数据库5
中的订单信息和访问第三方支付平台所返回的信息,查找出错误订单,将这些订单移入失败
表中,并向相关人员发送邮件预警。本系统采用 JMS(Java Message Service)作为中间件,使
用生产者消费者模式编写程序,利用 Swing 编写系统界面,系统启动后,能够查找出不同错
误类型的订单,并发送预警信息。
关键词:JMS;MySQL;支付平台;生产者;消费者 10
中图分类号:TP315
Design and Implementation of the Order Inspection System
based on JMS
KUANG Rongjie, YANG Huidong 15
(School of Information Science and Technology, JINAN University, GuangZhou 510632)
Abstract: The purpose of order inspection system is inspecting orders which are saved in MySQL
database. After comparing the information of the orders in database with the information from
payment platform, this system can find fallacious orders. When finding them, it will put them into
the failorders and send warning information to related personnel. This system makes use of JMS 20
as its middleware, takes advantages of producer-consumer model to write codes, use Swing to
write system interface, when order inspection system starts, it can find different kinds of wrong
orders and send warning emails.
Keywords: JMS; MySQL; payment platform; producer; consumer
25
0 引言
随着信息时代的高速发展,网上购物逐渐由一种时尚变成一种司空见惯的现象,这种简
单快捷的购物方式会随着互联网技术的不断进步而走进千家万户,因此也引来众多商家的青
睐。淘宝,卓越这些大商家暂且不提,像一些小型的网页游戏公司,团购网站都有自己的支
付网关,对外可以提供十几种甚至几十种支付方式。诸多支付方式给用户带来方便的同时,30
也给公司的支付网关带来了挑战[1,2]。网络延迟,系统故障以及其它异常情况都会影响到支
付网关中订单信息的准确性。订单后督系统就是针对这种情况而开发的。
客户网上购物过程如下:在客户选好商品提交订单后,支付系统会在数据库的订单请求
表(后文用 req 表代替)中添加用户的购买信息,若在规定时间内,用户在第三方支付平台
完成付款,且支付系统收到第三方支付平台的响应信息,支付系统会将订单从 req 表中移入35
订单成功表(后文用 ok 表代替)中,并向用户发送商品或服务。订单后督系统通过校验本
地数据库中 req 表、ok 表的订单信息,来确保订单的准确性,防止漏单,付款金额不一致等
情况的发生。
1 订单后督系统的数据库设计
订单后督系统采用 MySQL 数据库,通过 JDBC 连接,在数据库中设计了俩张数据表,40
- 2 -
中国科技论文在线
分别是:监控信息配置表 monitor 和失败订单存放表 failorders。
表 1.监控信息配置表
Table 1. monitoring information configuration table
字段 类型 说 明
seqid bigint 主键
monitorType varchar 监控方式
monitorName varchar 监控对象的支付名称
orderType varchar 表类型 ok/req
sql varchar 查询订单的 sql 语句
startMins int 查询订单的开始时间
endMins int 查询订单的截止时间
queryClass varchar 查询接口类全路径
queryMethod varchar 查询方法名
queryVariable varchar 查询方法参数类型
45
表 2.失败订单存放表
Table 2. the information of failed orders table
字段 类型 说 明
SeqId bigint 主键
Tradeseqid bigint 订单号
BalanceDate varchar 订单产生时间
Monitorname varchar 监控对象的支付名称
Failcount int 查询次数,最大为 5
FailDesp text 查询失败的信息
IsAlarm varchar 标志位,S:重查成功;E:异常;N:预警
monitor 表中存有系统启动时所需的配置信息,其中包含提取订单所需的 sql 语句,调
用 java 反射查询方法时所需第三方查询接口的类路径、方法名和参数类型,详细信息如表 1。50
failorders 表中存放查询有误的订单信息,其中包括错误订单的类型,对错误信息的描述,
查询次数以及是否已经预警,详细信息如表 2。订单后督系统启动时,需根据 monitor 表中
的配置信息建立查询线程,查询线程的数目与配置信息条数相同,当查询到错误订单后,系
统会将其移入 failorders 表中[3-6]。
2 订单后督系统的具体实现 55
订单后督系统是整个支付系统的一个子系统,是为了尽量保证所有的支付订单的准确性
而设计的。后督系统独立开发,独立运行。但它的数据来源以及信息配置需要依赖于其他业
务线。后督系统与各业务系统的关系如图 1,订单后督系统启动时,需从风控后台的配置数
据表中获得配置信息,运行时,从支付网关下的数据库中提取订单信息,然后根据订单号和
其它信息通过查询接口访问第三方支付平台获得用户在第三方支付平台中的订单信息,最后60
将支付网关的订单信息和第三方支付平台的订单信息做对比,查找出信息不一致的订单,并
将其移入 failorders 表。
- 3 -
中国科技论文在线
图 1.订单后督系统与各业务系统关系图
Figure 1. the relationships of Order Inspection System with other business systems 65
订单后督系统系统采用 JMS 这个 API 作为中间件,分成前后两部分:消息生产者和消
息消费者,而 JMS 用来在两个部分之间进行异步通信。当消息生产者将读取到的订单信息
发送到 JMS 服务器时,JMS 的监听器会监听到这些消息,然后调用消息消费者相应的 handler
来处理这些消息[7-10]。 70
消息生产者
消息生产者模块的主要功能为:从数据表 monitor 中读取所有支付方式的配置信息,然
后根据配置信息生成监控线程,并放入线程池中等待执行。当监控线程启动之后,根据配置
信息,到相应的数据表中读取数据,并发送到 JMS 服务器。具体过程如图 2 所示。为提高
程序的执行效率,减少系统运行时所占用的内存空间, monitor 表中的配置信息只在系统启75
动时读取一次,所以在添加或删除第三方查询接口后,需重新启动系统。
图 2.生产者生产消息流程
Figure process of producer producing news 80
订单后督系统抛弃了复杂的线程时间算法,改用定时任务模式,定时任务由 java 中的
定时器来实现,只需要将从 monitor 数据表读取出来的监控信息,按照其设定的 sql 语句来
- 4 -
中国科技论文在线
生成监控线程的业务,然后根据 monitor 表中的 firstRunDelay 和 period 字段将线程放入线程
池中,一旦设定的延迟时间到期,线程就会自动执行。 85
订单后督系统需核查数据库中订单以及部分 failorders 数据表中的订单,因此其监控方
式分为俩种:普通监控和特殊监控。普通监控方式生成的线程按照 sql 语句去对应的支付方
式的订单表中批量读取满足 sql 的订单信息,然后发送给 JMS 服务器;特殊监控方式生产的
监控线程先依据 sql 语句从 failorders 表中读取失败的订单信息(此处只包含订单的订单号、
订单时间、订单的支付方式等可以唯一确定订单的信息,而不是详细信息),然后再去对应90
的支付方式的订单表中读取每条订单的详细信息(包括订单金额等),然后发送给 JMS 服
务器
在提取订单时,从 req 表和 ok 表中提取订单的方式不同,从 req 表中提取订单是按照时
间段提取,每次提取当前时间的前两个小时到前一个小时之间的所有订单,每隔 55 分钟提
取一次,这是因为 req 表存放的是未付款订单,若这些订单在一个小时内未移出 req 表,订95
单后督系统才会提取检查;从 ok 表中提取订单那是按最大 ID 提取,每次提取 1000 条,同
时在系统中记录提取后的最大 ID,下次从最大 ID 开始提取 1000 条。
消息消费者
消息消费者模块的主要功能为:接收从 JMS 服务器发送过来的订单信息,然后与访问
第三方支付平台返回的数据进行校验,对校验无误的订单不做处理,对校验有误的订单,将100
其移入 failorders 表。具体过程如图 3。
图 3.消费者消费消息流程
Figure process of consumer consuming news 105
订单后督系统涉及到多种支付方式,因此具有多个第三方查询接口,系统规定统一的第
三方查询接口的返回码类型:HashMap<String,String>,该 hashMap 包括三个键值对,具体
信息如表 3。
req 表中的订单对比后可能出现的情况:1. req 表中存在这笔订单,但是第三方支付平台110
不存在这笔订单,这是正常的,这说明客户只是下了订单,但未付款,系统对这种情况不做
任何处理;2. req 表中存在这笔订单,第三方支付平台也存在这笔订单,这是不正常的,这
说明客户已付款,但是我们没有给客户发送产品,属于漏单的现象,遇到这种情况,系统会
将这笔订单放入 failorders 表中,同时设置 IsAlarm=’N’,直接预警。
ok 表中的订单对比后可能出现的情况:1. ok 表存在这笔订单,第三方支付平台也存在115
这笔订单,并且对比金额一致,这是正常的,系统对这种情况不做任何处理;2. ok 表存在
- 5 -
中国科技论文在线
这笔订单,但是第三方支付平台不存在这笔订单,这可能是由网络异常导致数据接收不及时
所造成的,出现这种情
表 3.查询接口的返回码
Figure 3. the return code of query interface 120
Key Value 说 明
rtn 查询接口返回码,为
E/Y/N
E:查询异常,连接第三方支付平台接口响应超时;Y:连接第三方支付平台成功,且订单
存在;N:连接第三方支付平台成功,但订单不存在
amount 订单金额 对于 rtn 为 E 或 N 的情况,该字段无用;对于 rtn 为 Y 的情况,该字段表示订单在第三方接口记录的订单金额
msg 查询第三方接口返回的记录消息 存取查询过程的信息,如查询出现差错时的错误码类型,订单号等等
况后,系统会将这笔订单存放到 failorders 表中,同时设置 IsAlarm=’E’,Failcount 加 1,
继续查询,若查询 5 次仍然是这种情况,则设置 IsAlarm=’N’,预警;3. ok 表存在这笔订单,
第三方支付平台也存在这笔订单,但是对比金额不一致,这说明付款过程出现问题,这种情
况,系统会将这笔订单放入 failorders 表中,设置 IsAlarm=’N’,直接预警。 125
3 订单后督系统的运行结果
订单后督系统不依赖支付系统,可以独立运行,具体运行界面如图 4 所示,在查询接口
配置选项中可以添加或删除查询接口;在订单管理中可以执行查询,刷新等操作;在系统管
理中,可以添加管理员,设置账号和密码。
130
图 4 订单后督系统的运行界面
Figure 4. the running interface of Order Inspection System
以 日网上购物的一笔订单为例,这笔订单使用工商银行的网上支付方式进行135
付款。在利用后督系统查询无误后,对数据库中的订单信息做了部分修改后继续查询,具体
结果如下:1.修改订单的数据表类型,将订单由 ok 表移入 req 表中,然后启动系统查询,结
果订单被移入 failorders 表中,并提示用户已付款,但系统未作处理,直接预警;2.断开网
络连接但不修改订单信息,启动系统查询后,对订单进行第一次查询时,系统会将订单移入
failorders 表中,并提示网络连接超时,但不预警,而后,系统会每间隔 5 分钟,就对此订140
单查询一次,查询 5 次后才会预警;3.修改数据库中订单信息的金额一项,然后查询,结果
订单被移入 failorders 表中,并提示数据中的订单金额和用户的付款金额不符,直接预警;
4.针对第二种情况,在查询次数未超过 5 次时,将网络连接回复,系统重查成功后,会对订
单标志位做处理,而后不再查询,但不会移出 failorders 表。
- 6 -
中国科技论文在线
4 结语 145
订单后督系统采用 JMS 作为消息中间件,使用生产者消费者模式作为系统架构,利用
JDBC 连接数据库,能够高效精确地查找出错误订单并将错误订单的信息及时地更新到数据
库中。本系统支持不同种类的订单查询,对访问不同支付平台所返回的订单信息进行了统一
的包装,因此,具备良好的可扩展性,在以后添加新的接口时,只需在配置界面上添加必要
的配置信息即可。经测试,订单后督系统可以精确无误地查找出错误订单,并能够分辨出需150
要预警的订单和需要再次核查的订单,而后做出相应的处理。
[参考文献] (References)
[1] 何其帼,林梅华.网上购物行为影响因素实证研究[J].经济管理,2006,5:40~49
[2] 黎志成,刘枚莲.电子商务环境下的消费者行为研究[J].中国管理科学,2002,10:88~91 155
[3] 王珊, 萨师煊.数据库系统概论[M].北京:高等教育出版社, 2006.
[4] ,, , Reference edition[M]. Sweden: MySQLAB,
2006。
[5] Charles .深入理解 MySQL[M].杨涛,王建桥,杨晓云等译.北京:人民邮电出版社,2010.
[6] 唐建国.MySQL 数据库系统安全分析[J].电脑知识与技术,2010,6(23):18-20 160
[7] 张帆等.java 范例开发大全[M]. 北京: 清华大学出版社,2010.
[8] 何慧, 陈博. 基于 XML 和 JMS 的异构数据交换集成的研究[J]. 计算机技术与发展, 2006,2:28-31.
[9] 黄莎. JMS 消息中间件在数据集成系统中的研究与应用[D].广州:暨南大学,2008.
[10] 朱方娥. 基于 JMS 的消息队列中间件的研究与实现[J]. 计算机技术与发展, 2008,5:123~125
165