发明内容
针对金融自助设备的上层应用由于无法对同类复合模块并发调用、导致上层应用无法正常运行的技术问题,本发明提供一种基于CEN/XFS的读卡类复合模块的并发调用方法,保证金融自助设备的上层应用正常运行。
为实现上述技术目的,本发明采用如下技术方案:
一种基于CEN/XFS的读卡类复合模块的并发调用方法,包括:
(1),在复合模块与应用程序层之间设置复合SP服务和并列的N个子服务,所述N个子服务分别与复合模块的N个子模块一一对应;
(2),SP子服务从应用程序层接收对应的读卡指令,通过复合SP服务设置相应的中断启动标识;其中,设当前接收到的读卡指令为当前读卡指令,接收到当前读卡指令的SP子服务为当前SP子服务;
(3),判断当前SP子服务是否支持介质状态检测:若支持,则当前SP子服务在检测到介质时,将当前读卡指令发送给复合SP服务;若不支持,则当前SP子服务直接将当前读卡指令发送给复合SP服务;
(4)、复合SP服务从SP子服务接收到当前读卡指令时,判断是否存在其他读卡指令:
若存在其他读卡指令,则通过指令中断机制判断其他读卡指令是否被当前读卡指令中断,若是则执行当前读卡指令,若否则在执行其他读卡指令后再执行当前读卡指令;
若不存在其他读卡指令,则执行当前读卡指令;
复合SP服务将当前读卡指令的执行结果反馈给SP子服务;
(5)、当前SP子服务若支持介质状态检测,则在接收到执行结果后,通过复合SP服务设置相应的中断关闭标识,当前读卡指令执行结束;
当前SP子服务若不支持介质状态检测,且当前读卡指令的执行结果为未被中断,则在接收到执行结果后,通过复合SP服务设置相应的中断关闭标识,当前读卡指令执行结束;
当前SP子服务若不支持介质状态检测,且当前读卡指令的执行结果为被中断,则在接收到执行结果后,由当前SP子服务重新将当前读卡指令发送给复合SP服务。
在有并发功能需求的场景下,当前SP子服务若支持介质状态检测,当用户未放介质(介质在本发明中具体指卡)时,将当前读卡指令堵塞在介质状态循环检测流程里,而不会直接将当前读卡指令直接发给复合SP服务执行,使复合SP服务收到多条并发读卡指令的顺序由用户放介质的顺序决定,有效解决读卡类复合模块对于多条读卡指令的并发执行问题,从而使应用程序层发送的当前读卡指令不会因未放入介质而影响到卡片关联业务的办理。
在没有并发功能需求的场景下,复合SP服务同样可以单独为应用程序层提供读卡类复合模块功能调用。
在更优的技术方案中,所述通过指令中断机制判断其他读卡指令是否被当前读卡指令中断,若是则执行当前读卡指令,若否则执行其他读卡指令后再执行当前读卡指令,具体包括:
若当前读卡指令支持被中断,则获取其他读卡指令的中断标识状态和对应的介质状态,且在其他读卡指令的中断标识状态为真且存在对应的介质时,复合SP服务执行该其他读卡指令,否则复合SP服务执行当前读卡指令;
若当前读卡指令不支持被中断,则复合SP服务执行当前读卡指令。
若当前SP子服务不支持介质状态检测,而其他SP子服务支持介质状态检测,即使当前SP子服务在未知介质状态的情况下直接将当前读卡指令发送给了复合SP服务,但是复合SP服务会根据以下几点来综合判断优先执行其他读卡指令还是当前读卡指令:当前读卡指令是否支持被中断,其他SP子服务发送的读卡指令的中断标识状态以及介质状态。若优先执行其他读卡指令,当前SP子服务会根据复合SP服务对当前读卡指令反馈的执行结果,在下一个轮询重新发送当前读卡指令给复合SP。
在更优的技术方案中,所述N个SP子服务至少有1个支持介质状态检测。
在更优的技术方案中,所述其他读卡指令是指,除当前SP子服务之外的其他SP子服务在此之前从应用程序层接收,并发送给复合SP服务且未执行完的读卡指令。
在更优的技术方案中,所述当前读卡指令以及其他读卡指令是否支持被中断,根据对应的子模块的性质进行预先设置。
在更优的技术方案中,所述N个SP子服务包括:接触SP子服务、非接触SP子服务和刷卡SP子服务,对应的N个子模块包括:接触读卡模块、非接触读卡模块和刷卡模块。
在更优的技术方案中,每个SP子服务通过标准SP API接口与应用程序层建立连接,每个SP子服务通过标准SP API接口与复合SP服务建立连接,且N个SP子服务之间为相互独立的进程。
本技术方案无需修改标准SP API接口层和XFS管理层,能够兼容传统金融自助业务应用流程,可以实现应用的无缝切换,并且适用于Windows和Linux等多种操作系统。
有益效果
本发明的有效效果包括:
在有并发功能需求的场景下,当前SP子服务若支持介质状态检测,当用户未放介质(介质在本发明中具体指卡)时,将当前读卡指令堵塞在介质状态循环检测流程里,而不会直接将当前读卡指令直接发给复合SP服务执行,使复合SP服务收到多条并发读卡指令的顺序由用户放介质的顺序决定,有效解决读卡类复合模块对于多条读卡指令的并发执行问题,从而使应用程序层发送的当前读卡指令不会因未放入介质而影响到卡片关联业务的办理。在没有并发功能需求的场景下,复合SP服务同样可以单独为应用程序层提供读卡类复合模块功能调用。
若当前SP子服务不支持介质状态检测,而其他SP子服务支持介质状态检测,即使当前SP子服务在未知介质状态的情况下直接将当前读卡指令发送给了复合SP服务,但是复合SP服务会根据以下几点来综合判断优先执行其他读卡指令还是当前读卡指令:当前读卡指令是否支持被中断,其他SP子服务发送的读卡指令的中断标识状态以及介质状态,。若优先执行其他读卡指令,当前SP子服务会根据复合SP服务对当前读卡指令反馈的执行结果,在下一个轮询重新发送当前读卡指令给复合SP。
无需修改标准SP API接口层和XFS管理层,能够兼容传统金融自助业务应用流程,可以实现应用的无缝切换,并且适用于Windows和Linux等多种操作系统。
具体实施方式
下面对本发明的实施例作详细说明,本实施例以本发明的技术方案为依据开展,给出了详细的实施方式和具体的操作过程,对本发明的技术方案作进一步解释说明。
传统的金融自助设备系统各层次之间的关系,如图1所示,包括:应用程序层、标准SPAPI接口层、XFS管理层、设备SP服务、硬件模块。其中,应用程序层通过各模块功能组合,实现金融自助设备各业务流程;XFS管理层,指管理程序调度过程中的句柄、请求ID、消息分发、内存管理等管理控制层,负责调用相应厂商定制的设备SP服务程序;设备SP服务,是指通过标准SP API接口层从应用程序层接收执行指令,完成设备具体操作并返回执行结果的服务程序。
在现有技术中,复合SP服务可完成对复合硬件模块的直接调用及各子模块功能的分类导出,主要由逻辑层和驱动层组成,见图2。逻辑层实现复合模块中各子模块功能逻辑。所述的子模块指组成复合模块的各功能模块,比如读卡复合模块,包含接触读卡子模块、非接读卡子模块、刷卡子模块等。驱动层实现对硬件设备的直接操作。复合SP服务支持信息指令的立即响应,但不支持执行指令的立即响应,而需要顺序执行,等待上一条执行指令完成后,才能响应。由于读卡指令为执行指令,假如复合SP服务的接触逻辑对象接收了读卡指令A,然后复合SP服务的非接逻辑对象接收读卡指令B,当用户放入非接触卡片时,复合SP服务不会立即响应执行对非接触卡片的读卡指令,而需要用户插入接触式卡片,完成接触式卡片的读取后,才能响应非接触卡片的读卡。这种读卡指令堵塞现象会导致应用程序层的业务无法正常运行。
本发明实施例中的硬件模块为由接触读卡子模块、非接读卡子模块和刷卡子模块组合得到的读卡类复合模块,本实施例方法首先将设备SP服务设置为复合SP服务和接触读卡SP子服务、非接读卡SP子服务、刷卡SP子服务这3个并列且独立的SP子服务,如图3所示,从而解决前述指出的读卡指令堵塞的问题。其中,接触读卡SP子服务、非接读卡SP子服务、刷卡SP子服务这3个SP子服务,分别与接触读卡子模块、非接读卡子模块和刷卡子模块这3个子模块一一对应。
完成上述在复合模块与应用程序层之间设置复合SP服务和并列的3个子服务后,每个SP子服务均可能随时收到来自应用程序层对应的读卡指令,因此为实现应用程序层对读卡类复合模块的并发调用,本实施例方法在复合SP服务和并列的3个子服务中引入状态轮询机制和指令中断机制,具体实现过程包括:
(2)、SP子服务从应用程序层接收对应的读卡指令,通过复合SP服务设置相应的中断启动标识;其中,设当前接收到的读卡指令为当前读卡指令,接收到当前读卡指令的SP子服务为当前SP子服务。
(3),判断当前SP子服务是否支持介质状态检测:若支持,则当前SP子服务在检测到介质时,将当前读卡指令发送给复合SP服务;若不支持,则当前SP子服务直接将当前读卡指令发送给复合SP服务。
(4)、复合SP服务从SP子服务接收到当前读卡指令时,判断是否存在其他读卡指令:
若复合SP服务判断当前还存在其他读卡指令,则进一步判断其他读卡指令是否被当前读卡指令中断:
若当前读卡指令支持被中断,则获取其他读卡指令的中断标识状态和对应的介质状态,且在其他读卡指令的中断标识状态为真且存在对应的介质时,复合SP服务执行该其他读卡指令,否则复合SP服务执行当前读卡指令;
若当前读卡指令不支持被中断,则复合SP服务执行当前读卡指令;
若复合SP服务判断当前不存在其他读卡指令,则执行当前读卡指令;
复合SP服务将当前读卡指令的执行结果反馈给SP子服务。
由于本实施例是为了解决应用程序层对复合模块的并发调用,复合SP服务可能在未执行完针对某个子模块的读卡指令时,又收到针对另一个子模块的读卡指令,因此本实施例设当前最新收到的任意读卡指令为当前读卡指令,当前未执行完的读卡指令为其他读卡指令,对每个当前读卡指令均按本实施例方法处理,进而实现应用程序层对读卡类复合模块的并发调用。
(5)、当前SP子服务若支持介质状态检测,则在接收到执行结果后,通过复合SP服务设置相应的中断关闭标识,当前读卡指令执行结束;
当前SP子服务若不支持介质状态检测,且当前读卡指令的执行结果为未被中断,则在接收到执行结果后,通过复合SP服务设置相应的中断关闭标识,当前读卡指令执行结束;
当前SP子服务若不支持介质状态检测,且当前读卡指令的执行结果为被中断,则在接收到执行结果后,由当前SP子服务重新将当前读卡指令发送给复合SP服务。
将以上实施例方法的实现过程,其实质是在N个SP子服务和复合SP服务中引入状态轮询机制和指令中断机制,状态轮询机制用于解决支持介质状态检测模块的并发执行问题,指令中断机制用于解决不支持介质状态检测模块的并发执行问题,如图3所示。
其中,如图4所示的状态轮询机制流程为:
步骤A1:SP子服务收到应用的读卡指令,发送中断启动标识A给复合SP服务,发送指令为信息指令,会被复合SP服务立即响应,设置给设备驱动对象;
步骤A2:判断子对象是否支持介质状态检测,若支持,执行步骤A3,反之,执行步骤A5;
步骤A3:向复合SP服务发起获取子对象状态信息的指令,并通过反馈的结果,判断用户是否放卡到子模块上;
步骤A4:若用户放卡,执行步骤A5,反之,执行步骤A3;
步骤A5:发送读卡指令A给复合SP服务;
步骤A6:复合SP服务收到读卡指令A后,判断当前是否存在其他执行指令(B\C\D)。
步骤A7:若存在,则通过指令中断机制判断当前被执行指令是否被读卡指令A中断,反之,执行步骤A9;
步骤A8:若当前执行指令被中断,开始执行步骤A9;反之,先完成当前指令的执行,再执行步骤A9;
步骤A9:执行读卡指令A,反馈执行结果给SP子服务。
步骤A10:判断子对象是否支持介质状态检测,若支持,发送中断关闭标识给复合SP服务,并完成指令返回;否则执行步骤A11;
步骤A11:判断反馈的执行结果是否为中断,若是,执行步骤A5。反之,发送中断关闭标识给复合SP服务,并完成指令返回。
从状态轮询机制流程的步骤A3和步骤A4可以看出,当客户未放卡时,所有的读卡指令均堵塞在状态检测的流程里,而不会下发读卡指令给复合SP服务,复合SP服务收到读卡指令的顺序则由用户放卡的顺序决定,不会影响到卡片关联业务的办理。
如图5所示的指令中断机制流程为:
步骤B1:SP子服务A接收到读卡指令,不支持介质状态检测,直接发送读卡指令A给复合SP服务。
步骤B2:复合SP服务接收到读卡指令A,根据每个子模块的逻辑对象设定的能力来判断该指令是否允许被中断。若允许,执行步骤B3。反之,执行步骤B5。所述的根据每个子模块的逻辑对象设定能力,可以根据模块特性确定,比如,非接读卡子模块的读卡指令被复合SP服务接收到,能力设定为不允许被中断;刷卡子模块的读卡指令被复合SP服务接收到,能力设定为允许被中断。
步骤B3:获取中断标识(B\C\D)状态和子对象(B\C\D)介质状态。其中的中断标识(B\C\D)状态由其他SP子服务(B\C\D)的指令来设置。
步骤B4:通过获取信息的判断,当中断启动标识为真且对应介质状态存在时,执行步骤B7。反之,执行步骤5。
步骤B5:执行子对象A的读卡动作。
步骤B6:判断读卡动作是否执行完成,若完成,执行步骤B7。反之,执行步骤B5。
步骤B7:SP子服务A收到复合SP服务反馈的执行结果后,判断指令是否被中断。若中断,执行步骤B1;反之,完成指令的执行。
假设SP子服务A不支持介质状态检测,SP子服务B/C/D均支持介质状态检测。由以上本实施例方法的实现过程可以得到,SP子服务A在用户没有放入介质前,其读卡指令A会在发送中断启动标识后即直接发送给复合SP服务程序;SP子服务B/C/D则会先发送中断启动标识给复合SP服务,然后进入到介质状态轮询检测阶段,等待用户放入其对应的介质后,再将其读卡指令B/C/D发送给复合SP服务程序。
假设当前SP子服务B最新接收到读卡指令B,此时复合SP服务存在读卡指令A,即读卡指令B为当前读卡指令,读卡指令A为其他读卡指令;此时SP子服务B会先发送中断标识给复合SP服务程序,然后进入到介质状态轮询检测阶段,等待用户放入其对应的介质。当用户放入其响应的介质后,复合SP服务程序根据中断标识B和介质状态B的反馈,将当前正在执行的读卡指令A中断,来响应读卡指令B。SP子服务A从复合SP服务接收到读卡指令A的读卡指令为被中断,会在下一个轮询,重新发送读卡指令A给复合SP服务,继续进行读卡。读卡指令B则会在读卡指令A重新发送前执行完成,将用户放入介质的卡信息反馈给应用程序层。
如图6所示对应的实施例,假设应用程序层同时对复合模块的各子服务发送读卡指令,应用程序层通过SP API接口层把所有读卡指令分别发送给对应的SP子服务。SP子服务通过复合SP服务提供标准SP API接口,完成设备的功能调用。3个SP子服务轮询监控介质状态,若存在介质,则通过标准SP API接口,发送读卡指令给复合SP服务。复合SP服务收到读卡指令后,完成对应子模块的读卡动作。优先被检测到的介质将优先完成读卡,即无论应用程序按哪种顺序调用各子模块对象的读卡指令,用户最先放入的介质将优先被读取。
以上实施例为本申请的优选实施例,本领域的普通技术人员还可以在此基础上进行各种变换或改进,在不脱离本申请总的构思的前提下,这些变换或改进都应当属于本申请要求保护的范围之内。