图2 PMS系统架构图
处理流程为:接收pos上送的报文数据,检查,判断是否是IC卡交易,如果不是就直接组织64域报文,发送到pos,否则就走UL流程,将报文转化成128域数据发送给UL主机,接收主机返回数据,组织64域报文下发到pos机。
图 3 pos 通信进程处理流程图
图 4 主机通信流程
图 5 8583 打包解包类静态UML图
图6 package com.pax.pms.pospacker UML 图
图7 PosDataProcess处理的处理流程
图8 HostDataProcess的处理流程
数据存储 package com.pax.pms.database
DbManager
功能:数据库管理相关操作,调用JDBC API与数据库建立连接、操作数据库的语句并返回处理结果。
对外接口:
/**
* 获取DbManager对象
* @return DbManager object
**/
public static DbManager getInstance();
/**
* 取得一个Connection
**/
public static Connection getConnection();
/**
* 释放Connection
* @param con
*/
public static void freeConnection(Connection con);
依赖接口:无
AidBean
功能:提供PMS项目中aid相关参数的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
CapkBean
功能:提供PMS项目中公钥信息需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
ParamBean
功能:提供PMS项目中与UL和Pos通信需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
CardBean
功能:提供PMS项目中IC卡信息需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
RecordBean
功能:提供PMS项目中交易记录需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
TerminalBean
功能:提供PMS项目中终端信息需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
TransBean
功能:提供PMS项目中传输数据需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
UserBean
功能:提供PMS项目中用户登入信息需要存储的数据结构,提供数据库相关操作
对外接口:各种参数的set,get方法,提供update,insert,query等操作
依赖接口:无
界面展示
UI界面采用Web网页的方式进行展示,采用轻量Servlet容器(Tomcat)和开源pushlet来实现。
Tomcat作为Servlet容器,负责处理客户请求,把请求传送给Servlet并把结果返回给客户。Servlet容器与Servlet接口是由Java Servlet API定义。
图 9 一个页面请求流程
采用Pushlet 来展示交易记录信息,当有交易信息时就立即展示在web界面。Pushlet 是pushlet是comet的一个实现框架,在Servlet机制下,数据从server端的java对象直接推送(push)到html页面。Pushlet中的EventPullSource类实现了EventSource及runnable这两个接口,通过继承EventPullSource类,重写getSleepTime和 pullEvent方法可实现交易记录信息的推送,当产生了新的交易,即产生了一个event,在EventPullSource类的run()接口中调用 Dispatcher.getInstance().multicast(event)实现消息推送,其工作原理如下所示;
图 10 Pushlet 工作原理
大致流程:
1、browser发送join命令到server,server产生唯一的ID给client端,用于标识这次会话的唯一性,Pushlet是用java.rmi.server.UID产生的唯一的标志会话的标志,此时server会把sessionID作为key,session对象作为value,存放到HashMap里面,然后通过response.getWriter().println()回调给browser
2、browser拿到sessionID,并发送listen命令,listen命令,有subject,提交给server,server首先验证Session HashMap里面有没有这个sessionID,验证通过后,回调给客户端listen_ack消息,同时开始从eventQueue取出数据,并update给客户端,这里的queue符合生产消费模式,eventsource是生产线程,它负责把数据enqueue入队列,如果满则等待,直到消费线程消费。