APP下载

基于PK对战模式的油田井控知识在线练习系统

2022-08-02解红涛赵伟林

系统仿真技术 2022年1期
关键词:题库线程答题

解红涛 ,赵伟林

(1.东北石油大学计算机与信息技术学院,黑龙江 大庆 163318;2.武警陕西总队机动支队,陕西 西安 710038)

油田井控指的是在油田生产施工过程中对发生的井涌及井喷进行控制,具体而言是指通过特定的技术手段,对地下开采区域的压力进行调控,以确保井下压力平衡,从而进行油田资源的安全开采[1]。油田井控技术的正确应用能够有效、及时地控制井涌井喷,保护油气层,避免破坏资源以及环境污染。因此,油田井控业务人员的专业知识水平高低决定了能否正确运用井控技术避免油田事故的发生。为了提高井控业务人员的专业知识水平,油田企业开始引进并实施各种员工培训计划方案。传统的纸质资料培训、讲课培训,主要是以文字为内容载体,以课堂讲授为培训的形式,虽有一定的培训效果,但形式单调,内容枯燥,难以激发学员的学习热情,培训效果并不理想[2]。在油田企业的井控培训中,有的使用设备模拟事故发生,进行井控操作培训,但是这种形式成本高、数量少,受培训时间和地点限制等,不能广泛应用。

随着网络技术和教育技术的发展,在线培训逐渐成为一种常用的培训方式。在线练习作为在线培训的一种重要形式,相对于传统的纸质练习形式,在线练习系统更加快捷,练习安排更加省时省力,并且能够打破常规的时间和地域约束,学员答题练习自由、操作简单。为了提高学员的学习热情,有的学习平台引入了PK(Player Killing)对战练习模块,比如常用的“学习强国”APP中具有“双人对战”和“四人赛”等学习模块[3];祝翔等人[4]研发的基于WebSocket的PK答题系统也具有PK答题功能。这些PK功能提高了用户的使用热情。但是在油田专业知识尤其是井控知识培训领域中未见引入PK对战模式。

本文借鉴网络游戏中的PK对战思想,把PK对战学习模式融入到井控知识在线练习系统中。系统中的在线PK模块采用共享内存形式实现进程间通信,采用的数据库为MySql5.7,因为该版本数据库支持EVE定时任务,方便模拟消息进程用户传递和维护信息。融入了PK对战模式的井控知识在线练习系统,结合积分奖励机制,能够极大地提高学员的热情,达到良好的培训效果。

1 系统的开发框架设计

为实现学员对井控知识的练习不受时间和空间的限制,本文研发的系统采用B/S模式,应用SSM开发框架,整体架构采用MVC设计模式。该系统功能模块主要包括6个部分:用户信息管理、井控资料管理、答题积分管理、题库管理、个人在线练习、PK对战。系统开发思想为AOP面向切面开发,Spring为整体控制容器,包括类对象的创建与分配,采用单例模式生成,从而保证线程间数据独立。

2 系统关键技术研究

2.1 进程间通信

系统在线PK模块需要模拟2个用户的信息交互,即进程间通信。进程间通信主要包括7种方式:管道、命名管道、消息队列、共享内存、信号、信号量、套接字。井控知识在线练习系统主要用到上述中的共享内存,即用户双方共享数据库中同一个数据块[5]。

2.1.1 共享内存

共享内存允许2个不同的继承或用户同时访问。不同进程之间共享的内存通常是相同的物理内存段。进程可以将相同的物理地址段连接到自己的地址空间,所有进程都可以访问共享内存中的地址。如果一个进程将数据写入共享内存,所做出的更改会被其他会话监听。该方式不提供线程同步相关支持,即没有自动机制阻止第二个进程开始读取共享内存,直到第一个进程完成对共享内存的写入操作。因此在后台模拟数据监听时,所建立的线程必须是用户间独立,每一个用户不可以在后台直接申请实例化线程,需要用户创建匿名线程并绑定在自己的后台服务代码上[6]。

2.1.2 模拟实现方式

数据库采用的是MySql5.7版本支持计划事物EVE[7]。当用户登录时分配唯一绑定的数据库会话,从Spring-config中的C3P0数据库连接池申请,默认单例保持唯一。用户登录成功后会通过JDK1.8版本特性Lambda创建内部线程,因为线程匿名存在,会自动绑定用户独立的代码部分,随着主类的释放而释放,即随着用户的退出而释放。只需要让线程去监听或修改数据库信息内容,就能达到获取信息、发送信息的效果。同时数据库定时任务会对用户的状态信息做维护,比如用户登录状态每30秒刷新一次以判断他人是否在线。

2.2 Session控制

服务器端共享内存解决在线PK问题,Session在其中起到了重要作用。Session变量为服务器端变量,存在服务器上,主要形式为Key-Value键值对存储形式,支持Map集合形式可以作为共享内存的消息表。Session中Key储存在服务器端内存上,Value储存在堆上,服务器自行管理Session的Key-Map,整体访问速度较快,自带时间参数方法,一段时间未被读写将被数据库释放,使用时要设置释放时间超过整个在线PK的时间,释放后不会影响后台线程的运行,这样就能发现用户挂机状态,即Session消失但是数据库显示登录状态,此时用户回到操作界面需要刷新才能正常使用。

3 系统核心功能设计实现

3.1 在线PK对战功能设计

该功能模拟两个用户间通信,采用共享内存的方式进行交互。首先登录者都有登录状态信息,其中一个用户可以查看其他用户的状态信息,根据状态信息找到PK对象发出PK请求,即修改对象用户PK状态信息为自己的ID,对方会看到自己的PK状态被改变,此时对方将给出回复,0代表拒绝,1代表同意。如果同意双方将进入答题界面,如果不同意,请求者会收到拒绝信息提示。为避免对方用户长时间无回应造成一直等待,需要加入数据信息维护函数,定时去改变用户状态信息,如30秒不回复函数将自动回复0拒绝。

在线PK过程中,主要实现方式为共享内存,异步刷新同一个数据表来模拟通信。主要处理方法分为两种:异步刷新(异步线程查询数据库)、设置状态(修改表内状态信息)。主要流程分为:查看状态(异步刷新)、发送请求(设置状态)、接受请求(异步刷新)、回复请求(设置状态)、接受答复(异步刷新)。这样就完成了一个完整的用户间会话。核心模块在线PK数据流如图1所示。

3.2 在线PK对战申请实现

当一方用户查看到另一方用户在线时,点击对方信息后面的“申请对战”功能按钮,发出对战申请。此时,该用户会将目标用户的对战目标(数据库中PK字段)信息设置为自己的ID,同时运用Ajax开启异步线程去监听对方答复(数据库中jieshou字段)。此时另一个用户有Ajax异步开启的线程监听自己的PK字段,如果PK字段ID发生改变,就会向界面弹出会话“用户ID为×××的人向您发出了对战申请”,如果点击接收,会将自己的jieshou字段变为1,表示接收邀请,此时双方会跳转到答题界面,并且将自己的pking变为对方的ID,表示在答题过程中。如果有第三人上线查看在线用户,就会看到正在答题的人并且无法再申请对战,保证PK人数一直是两个人。具体实现如图2所示。

3.3 在线PK对战实现

对战申请成功后,进入答题界面。在答题过程中,为了防止第三人再次发出PK请求造成干扰,需要实时将用户状态设置成PK模式,杜绝第三方用户干扰。因此,在答题界面前端引入Ajax异步,后台申请线程实时将自己的状态信息修改为PK对战中,同时数据库建立计划事务,每5秒对用户对战状态进行维护,保证为PK状态。

答题结束后,系统将数据提交到后台。通过计算得出结果并且将结果保存到数据库中,在数据库中有仿照RDS数据库消息队列实现的数据表,数据表中主要分为3个部分,即消息、消息发出者、消息接收者。因为对战双方提交答题时间不同,所以先提交的用户要等待后提交的答题结果。对战双方的结果界面还要有异步线程刷新消息队列表。当后完成提交的用户提交结束后,先提交的用户就能得到相应的结果消息,并且与自己的结果对比,从而得出最终的PK胜负。系统考虑到了两种特殊PK情况,一种情况是其中一个用户在PK时退出系统,另一个用户就不必等待结果直接判定胜利;另一种情况是设置等待结果的最长时间为答题的限制时间10分钟,其中一方答完提交后,若10分钟后对方还未答完提交,则判定对方PK失败。具体实现结果如图3所示。

图3中10个按键编号代表对应题目的正确情况,红色代表错误,绿色代表正确,点击红色按键就会显示对应题目的答案,点击绿色按键可以收藏对应的题目,同时错误的题目也会自动收藏到收藏表中。

3.4 个人在线练习功能实现

在线练习功能也是本系统最为重要的功能模块,主要划分为3个子功能,分别为:顺序练习、随机练习、强化练习3种组题方式,并且每种组题方式都分为计时与非计时两种模式。

(1)顺序练习:每个用户在完整信息子表中都有一个名为userpath表,它主要记录的信息为userid、部门题库、答题数量。用户答题前选择顺序答题模式,提交tisum(出题数量)和wbid(题库ID),后台首先会根据getSession获得自己的ID,再结合前台选择的题库ID找到用户答题数(tipath)。根据数据库全部题数(allsum)、出题数量以及自己的答题数目,确定每次顺序练习时的起始题目和结束题目。

(2)随机练习:用户提交前台答题设置信息,主要包括题库ID(bmid)和出题数量(tisum)等。后台接收到随机答题请求,首先根据题库ID(bmid)查找题库内全部题目数量,之后创建Set集合,利用Set集合特性(无序不可重复)和随机数范围0~(题库最大题目数量-1)这个区间去生成整数类型随机数并插入Set中,当Set长度达到题数(tisum)长度后结束,根据集合中的随机数到题库中抽题并将题目集合传送到前端完成组题工作。

(3)强化练习:每个用户在完整的数据子表中都有一个uaiti表,表中记录了用户收藏的题目以及答错的题目。主要结构为用户编号userid、题目标号tiid、收藏类型over。用户通过前端向后台提交数据:题库(wbid)、题数(tisum)。后台会以多表链接查询的方式从收藏表中采用上述随机数的模式去抽取题目,抽取到的题目跳转到答题界面完成组题。

(4)计时与非计时:用户在答题界面选择计时与非计时两种模式。若选择计时模式之后会出现时间选择框,系统会将选择模式及时间传入组题后台,组题结束后会将这些信息一起发送到答题界面端,答题界面会根据该信息做出判断。如果是计时就会根据计时时间预编译一个倒计时提示,事件结束后自动提交用户答案。计时模式的在线练习功能模块如图4所示。

4 结 论

为激发培训人员的学习热情,提高油田井控知识培训效果,本文在设计油田井控知识在线练习系统时引入了对战游戏中的PK对战模式,开发实现了具有PK对战模式的井控知识练习系统。在系统的PK对战功能中,采用了进程间通信、共享内存等技术,仿照Redis数据库方法,在MySql中申请本机事务权限,插入计划事务,模拟动态数据。同时还用到消息队列的思想与Ajax异步处理相结合实现消息传递与接收。本系统在满足井控知识练习培训需求的基础上,提高了员工答题练习的积极性。通过PK对战的答题形式,使用户摆脱了枯燥的单机模式,同时也能培养竞争意识,营造积极向上的学习氛围。

猜你喜欢

题库线程答题
5G终端模拟系统随机接入过程的设计与实现
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
国家职业技能鉴定铸造工职业题库开发成果审定会在沈阳召开
答题、拍照、必微博、求关注…… 减了老负担,又练“新技能”
挑战答题
“整式的乘法与因式分解”优题库
一场全民答题狂欢
熊孩子爆笑答题集
脑力急旋风