解紅濤 ,趙偉林
(1.東北石油大學計算機與信息技術學院,黑龍江 大慶 163318;2.武警陜西總隊機動支隊,陜西 西安 710038)
油田井控指的是在油田生產施工過程中對發生的井涌及井噴進行控制,具體而言是指通過特定的技術手段,對地下開采區域的壓力進行調控,以確保井下壓力平衡,從而進行油田資源的安全開采[1]。油田井控技術的正確應用能夠有效、及時地控制井涌井噴,保護油氣層,避免破壞資源以及環境污染。因此,油田井控業務人員的專業知識水平高低決定了能否正確運用井控技術避免油田事故的發生。為了提高井控業務人員的專業知識水平,油田企業開始引進并實施各種員工培訓計劃方案。傳統的紙質資料培訓、講課培訓,主要是以文字為內容載體,以課堂講授為培訓的形式,雖有一定的培訓效果,但形式單調,內容枯燥,難以激發學員的學習熱情,培訓效果并不理想[2]。在油田企業的井控培訓中,有的使用設備模擬事故發生,進行井控操作培訓,但是這種形式成本高、數量少,受培訓時間和地點限制等,不能廣泛應用。
隨著網絡技術和教育技術的發展,在線培訓逐漸成為一種常用的培訓方式。在線練習作為在線培訓的一種重要形式,相對于傳統的紙質練習形式,在線練習系統更加快捷,練習安排更加省時省力,并且能夠打破常規的時間和地域約束,學員答題練習自由、操作簡單。為了提高學員的學習熱情,有的學習平臺引入了PK(Player Killing)對戰練習模塊,比如常用的“學習強國”APP中具有“雙人對戰”和“四人賽”等學習模塊[3];祝翔等人[4]研發的基于WebSocket的PK答題系統也具有PK答題功能。這些PK功能提高了用戶的使用熱情。但是在油田專業知識尤其是井控知識培訓領域中未見引入PK對戰模式。
本文借鑒網絡游戲中的PK對戰思想,把PK對戰學習模式融入到井控知識在線練習系統中。系統中的在線PK模塊采用共享內存形式實現進程間通信,采用的數據庫為MySql5.7,因為該版本數據庫支持EVE定時任務,方便模擬消息進程用戶傳遞和維護信息。融入了PK對戰模式的井控知識在線練習系統,結合積分獎勵機制,能夠極大地提高學員的熱情,達到良好的培訓效果。
為實現學員對井控知識的練習不受時間和空間的限制,本文研發的系統采用B/S模式,應用SSM開發框架,整體架構采用MVC設計模式。該系統功能模塊主要包括6個部分:用戶信息管理、井控資料管理、答題積分管理、題庫管理、個人在線練習、PK對戰。系統開發思想為AOP面向切面開發,Spring為整體控制容器,包括類對象的創建與分配,采用單例模式生成,從而保證線程間數據獨立。
系統在線PK模塊需要模擬2個用戶的信息交互,即進程間通信。進程間通信主要包括7種方式:管道、命名管道、消息隊列、共享內存、信號、信號量、套接字。井控知識在線練習系統主要用到上述中的共享內存,即用戶雙方共享數據庫中同一個數據塊[5]。
2.1.1 共享內存
共享內存允許2個不同的繼承或用戶同時訪問。不同進程之間共享的內存通常是相同的物理內存段。進程可以將相同的物理地址段連接到自己的地址空間,所有進程都可以訪問共享內存中的地址。如果一個進程將數據寫入共享內存,所做出的更改會被其他會話監聽。該方式不提供線程同步相關支持,即沒有自動機制阻止第二個進程開始讀取共享內存,直到第一個進程完成對共享內存的寫入操作。因此在后臺模擬數據監聽時,所建立的線程必須是用戶間獨立,每一個用戶不可以在后臺直接申請實例化線程,需要用戶創建匿名線程并綁定在自己的后臺服務代碼上[6]。
2.1.2 模擬實現方式
數據庫采用的是MySql5.7版本支持計劃事物EVE[7]。當用戶登錄時分配唯一綁定的數據庫會話,從Spring-config中的C3P0數據庫連接池申請,默認單例保持唯一。用戶登錄成功后會通過JDK1.8版本特性Lambda創建內部線程,因為線程匿名存在,會自動綁定用戶獨立的代碼部分,隨著主類的釋放而釋放,即隨著用戶的退出而釋放。只需要讓線程去監聽或修改數據庫信息內容,就能達到獲取信息、發送信息的效果。同時數據庫定時任務會對用戶的狀態信息做維護,比如用戶登錄狀態每30秒刷新一次以判斷他人是否在線。
服務器端共享內存解決在線PK問題,Session在其中起到了重要作用。Session變量為服務器端變量,存在服務器上,主要形式為Key-Value鍵值對存儲形式,支持Map集合形式可以作為共享內存的消息表。Session中Key儲存在服務器端內存上,Value儲存在堆上,服務器自行管理Session的Key-Map,整體訪問速度較快,自帶時間參數方法,一段時間未被讀寫將被數據庫釋放,使用時要設置釋放時間超過整個在線PK的時間,釋放后不會影響后臺線程的運行,這樣就能發現用戶掛機狀態,即Session消失但是數據庫顯示登錄狀態,此時用戶回到操作界面需要刷新才能正常使用。
該功能模擬兩個用戶間通信,采用共享內存的方式進行交互。首先登錄者都有登錄狀態信息,其中一個用戶可以查看其他用戶的狀態信息,根據狀態信息找到PK對象發出PK請求,即修改對象用戶PK狀態信息為自己的ID,對方會看到自己的PK狀態被改變,此時對方將給出回復,0代表拒絕,1代表同意。如果同意雙方將進入答題界面,如果不同意,請求者會收到拒絕信息提示。為避免對方用戶長時間無回應造成一直等待,需要加入數據信息維護函數,定時去改變用戶狀態信息,如30秒不回復函數將自動回復0拒絕。
在線PK過程中,主要實現方式為共享內存,異步刷新同一個數據表來模擬通信。主要處理方法分為兩種:異步刷新(異步線程查詢數據庫)、設置狀態(修改表內狀態信息)。主要流程分為:查看狀態(異步刷新)、發送請求(設置狀態)、接受請求(異步刷新)、回復請求(設置狀態)、接受答復(異步刷新)。這樣就完成了一個完整的用戶間會話。核心模塊在線PK數據流如圖1所示。
當一方用戶查看到另一方用戶在線時,點擊對方信息后面的“申請對戰”功能按鈕,發出對戰申請。此時,該用戶會將目標用戶的對戰目標(數據庫中PK字段)信息設置為自己的ID,同時運用Ajax開啟異步線程去監聽對方答復(數據庫中jieshou字段)。此時另一個用戶有Ajax異步開啟的線程監聽自己的PK字段,如果PK字段ID發生改變,就會向界面彈出會話“用戶ID為×××的人向您發出了對戰申請”,如果點擊接收,會將自己的jieshou字段變為1,表示接收邀請,此時雙方會跳轉到答題界面,并且將自己的pking變為對方的ID,表示在答題過程中。如果有第三人上線查看在線用戶,就會看到正在答題的人并且無法再申請對戰,保證PK人數一直是兩個人。具體實現如圖2所示。
對戰申請成功后,進入答題界面。在答題過程中,為了防止第三人再次發出PK請求造成干擾,需要實時將用戶狀態設置成PK模式,杜絕第三方用戶干擾。因此,在答題界面前端引入Ajax異步,后臺申請線程實時將自己的狀態信息修改為PK對戰中,同時數據庫建立計劃事務,每5秒對用戶對戰狀態進行維護,保證為PK狀態。
答題結束后,系統將數據提交到后臺。通過計算得出結果并且將結果保存到數據庫中,在數據庫中有仿照RDS數據庫消息隊列實現的數據表,數據表中主要分為3個部分,即消息、消息發出者、消息接收者。因為對戰雙方提交答題時間不同,所以先提交的用戶要等待后提交的答題結果。對戰雙方的結果界面還要有異步線程刷新消息隊列表。當后完成提交的用戶提交結束后,先提交的用戶就能得到相應的結果消息,并且與自己的結果對比,從而得出最終的PK勝負。系統考慮到了兩種特殊PK情況,一種情況是其中一個用戶在PK時退出系統,另一個用戶就不必等待結果直接判定勝利;另一種情況是設置等待結果的最長時間為答題的限制時間10分鐘,其中一方答完提交后,若10分鐘后對方還未答完提交,則判定對方PK失敗。具體實現結果如圖3所示。
圖3中10個按鍵編號代表對應題目的正確情況,紅色代表錯誤,綠色代表正確,點擊紅色按鍵就會顯示對應題目的答案,點擊綠色按鍵可以收藏對應的題目,同時錯誤的題目也會自動收藏到收藏表中。
在線練習功能也是本系統最為重要的功能模塊,主要劃分為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所示。
為激發培訓人員的學習熱情,提高油田井控知識培訓效果,本文在設計油田井控知識在線練習系統時引入了對戰游戲中的PK對戰模式,開發實現了具有PK對戰模式的井控知識練習系統。在系統的PK對戰功能中,采用了進程間通信、共享內存等技術,仿照Redis數據庫方法,在MySql中申請本機事務權限,插入計劃事務,模擬動態數據。同時還用到消息隊列的思想與Ajax異步處理相結合實現消息傳遞與接收。本系統在滿足井控知識練習培訓需求的基礎上,提高了員工答題練習的積極性。通過PK對戰的答題形式,使用戶擺脫了枯燥的單機模式,同時也能培養競爭意識,營造積極向上的學習氛圍。