欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

實(shí)時(shí)數(shù)據(jù)推送方法和裝置與流程

文檔序號:12865946閱讀:273來源:國知局
實(shí)時(shí)數(shù)據(jù)推送方法和裝置與流程

本申請涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及實(shí)時(shí)數(shù)據(jù)推送方法和裝置。



背景技術(shù):

對于現(xiàn)代企業(yè),如何能使決策者隨時(shí)查看實(shí)時(shí)數(shù)據(jù),以便快速地做出更為靈活的商業(yè)決策,是企業(yè)信息化建設(shè)的關(guān)鍵。推送技術(shù)的基礎(chǔ)思想是將客戶端主動(dòng)查詢信息改為服務(wù)器主動(dòng)發(fā)送信息。服務(wù)器發(fā)送一批數(shù)據(jù),客戶端顯示這些數(shù)據(jù),同時(shí)保證與服務(wù)器的連接。

現(xiàn)有的實(shí)時(shí)數(shù)據(jù)推送方法通常是使用ajax(asynchronousjavascriptandxml,異步j(luò)avascript和xml)技術(shù),通過客戶端定時(shí)期輪詢向服務(wù)器請求json(javascriptobjectnotation,基于javascript語言的輕量級的數(shù)據(jù)交換格式)數(shù)據(jù),之后客戶端對數(shù)據(jù)進(jìn)行解析展現(xiàn)。然而,使用ajax技術(shù)每次通信都需要一個(gè)新的http(hypertexttransferprotocol,超文本傳輸協(xié)議)請求,服務(wù)器與客戶端之間建立的不是支持全雙工通信的連接,會(huì)導(dǎo)致數(shù)據(jù)延遲的問題,用戶無法精確獲得真實(shí)的實(shí)時(shí)數(shù)據(jù),且開啟多個(gè)監(jiān)控界面時(shí),服務(wù)器并發(fā)訪問的壓力大,面臨高并發(fā)請求的問題。



技術(shù)實(shí)現(xiàn)要素:

本申請的目的在于提出一種改進(jìn)的實(shí)時(shí)數(shù)據(jù)推送方法和裝置,來解決以上背景技術(shù)部分提到的技術(shù)問題。

第一方面,本申請?zhí)峁┝艘环N實(shí)時(shí)數(shù)據(jù)推送方法,所述方法包括:響應(yīng)客戶端發(fā)送的連接請求,與所述客戶端建立支持全雙工通信的連接;獲取客戶端發(fā)送的推送請求,其中所述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期;根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對 應(yīng)的實(shí)時(shí)數(shù)據(jù);通過所述連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述連接包括websocket連接;以及所述通過所述連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù),包括:通過所述websocket連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述推送周期為一秒;以及所述根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),包括:判斷是否是獲取所述推送請求后首次查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);如果是,則獲取當(dāng)前時(shí)間;響應(yīng)于當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)一致,查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),其中,所述時(shí)間點(diǎn)包括當(dāng)前時(shí)間的下一個(gè)整秒;如果否,則獲取當(dāng)前時(shí)間;判斷所述當(dāng)前時(shí)間與上一次查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的時(shí)間的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述推送周期為一秒;以及所述根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),包括:獲取當(dāng)前時(shí)間;判斷所述當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),包括:判斷用于根據(jù)所述推送周期周期性地推送所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程是否已經(jīng)啟動(dòng);如果否則啟動(dòng)用于根據(jù)所述推送周期周期性地推送所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程;根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

第二方面,本申請?zhí)峁┝艘环N實(shí)時(shí)數(shù)據(jù)推送裝置,所述裝置包括:連接建立單元,配置用于響應(yīng)客戶端發(fā)送的連接請求,與所述客戶端建立支持全雙工通信的連接;獲取單元,配置用于獲取客戶端發(fā)送的推送請求,其中所述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期;查詢單元,配置用于根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);推送單元,配置用于通過所述連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述連接包括websocket連接;以及所述推送 單元,進(jìn)一步配置用于通過所述websocket連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述推送周期為一秒;以及所述查詢單元,進(jìn)一步配置用于:判斷是否是獲取所述推送請求后首次查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);如果是,則獲取當(dāng)前時(shí)間;響應(yīng)于當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)一致,查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),其中,所述時(shí)間點(diǎn)包括當(dāng)前時(shí)間的下一個(gè)整秒;如果否,則獲取當(dāng)前時(shí)間;判斷所述當(dāng)前時(shí)間與上一次查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的時(shí)間的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述推送周期為一秒;以及所述查詢單元,進(jìn)一步配置用于:獲取當(dāng)前時(shí)間;判斷所述當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在一些實(shí)施例中,所述查詢單元,進(jìn)一步配置用于:判斷用于根據(jù)所述推送周期周期性地推送所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程是否已經(jīng)啟動(dòng);如果否則啟動(dòng)用于根據(jù)所述推送周期周期性地推送所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程;根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

本申請?zhí)峁┑膶?shí)時(shí)數(shù)據(jù)推送方法和裝置,通過響應(yīng)客戶端發(fā)送的連接請求,與所述客戶端建立支持全雙工通信的連接,而后獲取客戶端發(fā)送的推送請求,其中所述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期,之后根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),最后通過所述連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù),實(shí)現(xiàn)了實(shí)時(shí)數(shù)據(jù)的及時(shí)推送。

附圖說明

通過閱讀參照以下附圖所作的對非限制性實(shí)施例所作的詳細(xì)描述,本申請的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:

圖1是本申請可以應(yīng)用于其中的示例性系統(tǒng)架構(gòu)圖;

圖2是根據(jù)本申請的實(shí)時(shí)數(shù)據(jù)推送方法的一個(gè)實(shí)施例的流程圖;

圖3是根據(jù)本申請的實(shí)時(shí)數(shù)據(jù)推送方法的一個(gè)應(yīng)用場景的示意圖;

圖4是根據(jù)本申請的實(shí)時(shí)數(shù)據(jù)推送方法的又一個(gè)實(shí)施例的流程圖;

圖5是根據(jù)本申請的實(shí)時(shí)數(shù)據(jù)推送裝置的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;

圖6是適于用來實(shí)現(xiàn)本申請實(shí)施例的服務(wù)器的計(jì)算機(jī)系統(tǒng)的結(jié)構(gòu)示意圖。

具體實(shí)施方式

下面結(jié)合附圖和實(shí)施例對本申請作進(jìn)一步的詳細(xì)說明。可以理解的是,此處所描述的具體實(shí)施例僅僅用于解釋相關(guān)發(fā)明,而非對該發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與有關(guān)發(fā)明相關(guān)的部分。

需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本申請。

圖1示出了可以應(yīng)用本申請的實(shí)時(shí)數(shù)據(jù)推送方法或?qū)崟r(shí)數(shù)據(jù)推送裝置的實(shí)施例的示例性系統(tǒng)架構(gòu)100。

如圖1所示,系統(tǒng)架構(gòu)100可以包括終端設(shè)備101、102、103,網(wǎng)絡(luò)104和服務(wù)器105。網(wǎng)絡(luò)104用以在終端設(shè)備101、102、103和服務(wù)器105之間提供通信鏈路的介質(zhì)。網(wǎng)絡(luò)104可以包括各種連接類型,例如有線、無線通信鏈路或者光纖電纜等等。

用戶可以使用終端設(shè)備101、102、103通過網(wǎng)絡(luò)104與服務(wù)器105交互,以接收或發(fā)送消息等。終端設(shè)備101、102、103上可以安裝有各種通訊客戶端應(yīng)用,例如網(wǎng)頁瀏覽器應(yīng)用、購物類應(yīng)用、搜索類應(yīng)用、即時(shí)通信工具、郵箱客戶端、社交平臺軟件等。

終端設(shè)備101、102、103可以是具有顯示屏的電子設(shè)備,包括但不限于智能手機(jī)、平板電腦、電子書閱讀器、mp3播放器(moving pictureexpertsgroupaudiolayeriii,動(dòng)態(tài)影像專家壓縮標(biāo)準(zhǔn)音頻層面3)、mp4(movingpictureexpertsgroupaudiolayeriv,動(dòng)態(tài)影像專家壓縮標(biāo)準(zhǔn)音頻層面4)播放器、膝上型便攜計(jì)算機(jī)和臺式計(jì)算機(jī)等等。

服務(wù)器105可以是提供各種服務(wù)的服務(wù)器,例如與終端設(shè)備101、102、103建立支持全雙工通信的連接,獲取終端設(shè)備發(fā)送的推送請求,其中推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期,根據(jù)推送周期周期性地查詢數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),通過上述連接向客戶端推送實(shí)時(shí)數(shù)據(jù)的服務(wù)器。

需要說明的是,本申請實(shí)施例所提供的實(shí)時(shí)數(shù)據(jù)推送方法一般由服務(wù)器105執(zhí)行,相應(yīng)地,實(shí)時(shí)數(shù)據(jù)推送裝置一般設(shè)置于服務(wù)器105中。

應(yīng)該理解,圖1中的終端設(shè)備、網(wǎng)絡(luò)和服務(wù)器的數(shù)目僅僅是示意性的。根據(jù)實(shí)現(xiàn)需要,可以具有任意數(shù)目的終端設(shè)備、網(wǎng)絡(luò)和服務(wù)器。

繼續(xù)參考圖2,示出了根據(jù)本申請的實(shí)時(shí)數(shù)據(jù)推送方法的一個(gè)實(shí)施例的流程200。所述的實(shí)時(shí)數(shù)據(jù)推送方法,包括以下步驟:

步驟201,響應(yīng)客戶端發(fā)送的連接請求,與客戶端建立支持全雙工通信的連接。

在本實(shí)施例中,實(shí)時(shí)數(shù)據(jù)推送方法運(yùn)行于其上的電子設(shè)備(例如圖1所示的服務(wù)器)首先接收客戶端發(fā)送的連接請求,連接請求可以是通過http發(fā)送的。同時(shí),連接請求需表明請求建立的連接是支持全雙工通信的,即連接使用的是一種雙向通信協(xié)議。上述全雙工通信、雙向通信是指在建立連接后,服務(wù)器和客戶端都能主動(dòng)的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)。隨后,上述電子設(shè)備響應(yīng)接收到的連接請求,通常是返回?cái)?shù)據(jù)表示已經(jīng)接受到連接請求,連接成功建立。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述連接可以是websocket連接。websocket連接是指使用websocket協(xié)議的連接,websocket協(xié)議可以實(shí)現(xiàn)客戶端與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊。websocket連接建立時(shí),需要通過客戶端發(fā)出websocket連接請求,然后服務(wù)器發(fā)出回應(yīng),這個(gè)過程 通常稱為“握手”(handshaking),客戶端和服務(wù)器在初始握手時(shí),可以將http協(xié)議升級到websocket協(xié)議。websocket連接建立后,客戶端和服務(wù)器之間形成一條通道,后續(xù)可直接進(jìn)行數(shù)據(jù)的雙向傳送,不再需要發(fā)起連接和響應(yīng)。

步驟202,獲取客戶端發(fā)送的推送請求。其中推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期。

在本實(shí)施例中,上述電子設(shè)備(例如圖1所示的服務(wù)器)可以通過步驟201中建立的連接或者其他方式,例如也可以是通過http請求的方式,獲取客戶端發(fā)送的推送請求,其中推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期。如果推送請求中不包括數(shù)據(jù)的推送周期,也可以使用缺省的推送周期,例如一秒。

步驟203,根據(jù)推送周期周期性地查詢數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例中,上述電子設(shè)備(例如圖1所示的服務(wù)器)可以根據(jù)步驟202中得到的推送周期,周期性地查詢步驟202中得到的數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。通常,實(shí)時(shí)數(shù)據(jù)保存在數(shù)據(jù)庫中,例如,redis數(shù)據(jù)庫,redis數(shù)據(jù)庫是一個(gè)開源的支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、鍵-值存儲(key-valuestore)數(shù)據(jù)庫,并提供多種語言的api(applicationprogramminginterface,應(yīng)用程序編程接口)。查詢到的數(shù)據(jù)可以加入消息隊(duì)列中,以備推送步驟取用。具體的可以利用redis數(shù)據(jù)庫中列表“l(fā)ists”這種數(shù)據(jù)結(jié)構(gòu),來實(shí)現(xiàn)消息隊(duì)列。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,推送周期可以為一秒。推送周期為一秒時(shí),可以首先獲取當(dāng)前時(shí)間,之后判斷當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)的時(shí)間差是否為一秒的整數(shù)倍,如果是,則查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述時(shí)間點(diǎn)可以是當(dāng)前時(shí)間的下一個(gè)整秒。整秒的概念類似于整點(diǎn),是指毫秒數(shù)為零的時(shí)間點(diǎn)。當(dāng)前時(shí)間的下一個(gè)整秒計(jì)算方式可以是當(dāng)前時(shí)間的秒數(shù)加一,毫秒數(shù)歸零。例如,當(dāng)前時(shí)間是兩秒三十毫秒,那么當(dāng)前時(shí)間的下一個(gè)整秒即為三秒整。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,推送周期為一秒時(shí),也可 以判斷是否是獲取上述推送請求后首次查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);如果是,則獲取當(dāng)前時(shí)間;響應(yīng)于當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)一致,查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),其中,上述時(shí)間點(diǎn)包括當(dāng)前時(shí)間的下一個(gè)整秒;如果否,則獲取當(dāng)前時(shí)間;判斷上述當(dāng)前時(shí)間與上一次查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的時(shí)間的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。這樣,將上一次查詢時(shí)間作為基準(zhǔn),在調(diào)度的任務(wù)本身執(zhí)行時(shí)間不穩(wěn)定可能會(huì)出現(xiàn)超過1s時(shí),可以自動(dòng)校正下次調(diào)用時(shí)間。

在使用java編程語言編寫程序時(shí),通過scheduledexecutor或timer也可以實(shí)現(xiàn)間隔1s的調(diào)度。接口executor是一個(gè)簡單的標(biāo)準(zhǔn)化接口,用于定義類似于線程的自定義子系統(tǒng),包括線程池、異步io和輕量級任務(wù)框架,其子接口scheduledexecutorservice添加了對延遲的和定期任務(wù)執(zhí)行的支持。它們屬于并發(fā)工具包java.util.concurrent,java.util.concurrent是在并發(fā)編程中常用的實(shí)用工具類。scheduledexecutor是一個(gè)可以重復(fù)執(zhí)行任務(wù)的線程池,并且可以指定任務(wù)的間隔和延遲時(shí)間。但是通過scheduledexecutor無法實(shí)現(xiàn)每次調(diào)度在每個(gè)整秒即每秒的0毫秒時(shí)刻執(zhí)行。定時(shí)器timer屬于java.util.timer工具類,java.util包中可以找到timer。timer可以用來指定某個(gè)時(shí)間來執(zhí)行一項(xiàng)任務(wù),或者每隔一定時(shí)間間隔反復(fù)執(zhí)行同一個(gè)任務(wù)。timer雖然可以設(shè)置首次執(zhí)行時(shí)間,但是運(yùn)行一段時(shí)間后,也無法保證在每個(gè)整秒執(zhí)行任務(wù),如果任務(wù)本身執(zhí)行時(shí)間不穩(wěn)定,會(huì)出現(xiàn)超過1s的情況,無法自動(dòng)調(diào)整下次執(zhí)行時(shí)間。

步驟204,通過上述連接向客戶端推送實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例中,上述電子設(shè)備(例如圖1所示的服務(wù)器)可以通過步驟201中建立的連接,向客戶端推送步驟203中得到的實(shí)時(shí)數(shù)據(jù)。由于步驟201中建立的連接支持全雙工通信,所以連接建立后,只需等待觸發(fā)事件發(fā)生,而不需客戶端定期向服務(wù)器輪詢??梢酝ㄟ^添加回調(diào)函數(shù)來監(jiān)聽觸發(fā)事件,觸發(fā)事件發(fā)生后服務(wù)器能主動(dòng)向客戶端推送數(shù)據(jù),而不需要響應(yīng)于客戶端再次發(fā)送的請求才能推送數(shù)據(jù)。例如,觸發(fā)事件是當(dāng)前時(shí)間點(diǎn)是一個(gè)整秒,在服務(wù)器與客戶端之間已經(jīng)建立 了websocket連接的情況下,當(dāng)服務(wù)器判斷出當(dāng)前時(shí)間點(diǎn)是一個(gè)整秒時(shí),服務(wù)器可以直接向客戶端推送數(shù)據(jù)。

繼續(xù)參見圖3,圖3是根據(jù)本實(shí)施例的實(shí)時(shí)數(shù)據(jù)推送方法的應(yīng)用場景的一個(gè)示意圖。在圖3的應(yīng)用場景中,客戶端與服務(wù)器建立websocket連接后,用戶通過客戶端發(fā)起訂閱消息的動(dòng)作,客戶端向服務(wù)器發(fā)送包括用戶所需數(shù)據(jù)的信息的請求。例如,用戶請求當(dāng)日實(shí)時(shí)的訂單量數(shù)據(jù),希望獲取實(shí)時(shí)訂單量數(shù)據(jù)的時(shí)間周期是一秒。服務(wù)器通過建立的websocket連接接收到請求的數(shù)據(jù)的信息后,在數(shù)據(jù)庫中查詢所需數(shù)據(jù),并將查詢到的數(shù)據(jù)加入到消息隊(duì)列中作為待推送數(shù)據(jù)。最后推送線程向客戶端推送上述待推送數(shù)據(jù),客戶端接收到數(shù)據(jù)后就會(huì)如圖3所示,顯示當(dāng)前時(shí)間以及當(dāng)前時(shí)間對應(yīng)的訂單量的數(shù)據(jù),之后每秒更新數(shù)據(jù)。

本申請的上述實(shí)施例提供的方法通過服務(wù)器與上述客戶端建立支持全雙工通信的連接,使得服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù),每次推送信息時(shí)不都需要客戶端先發(fā)送請求,實(shí)現(xiàn)了實(shí)時(shí)數(shù)據(jù)的及時(shí)推送。

進(jìn)一步參考圖4,其示出了實(shí)時(shí)數(shù)據(jù)推送方法的又一個(gè)實(shí)施例的流程400。該實(shí)時(shí)數(shù)據(jù)推送方法的流程400,包括以下步驟:

步驟401,響應(yīng)客戶端發(fā)送的連接請求,與客戶端建立支持全雙工通信的連接。

在本實(shí)施例中,實(shí)時(shí)數(shù)據(jù)推送方法運(yùn)行于其上的電子設(shè)備(例如圖1所示的服務(wù)器)首先,接收客戶端發(fā)送的連接請求,上述連接請求需表明請求建立的連接是支持全雙工通信的,即連接使用的是一種雙向通信協(xié)議。隨后,上述電子設(shè)備響應(yīng)接收到的連接請求,通常是返回?cái)?shù)據(jù)表示已經(jīng)接受到連接請求,連接成功建立。

步驟402,獲取客戶端發(fā)送的推送請求,其中推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期。

在本實(shí)施例中,客戶端可以通過步驟401中建立的連接向上述電子設(shè)備發(fā)送推送請求,其中上述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期。如果推送請求中不包括數(shù)據(jù)的推送周期,也可以使用缺省的 推送周期,例如一秒。

步驟403,判斷用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程是否已經(jīng)啟動(dòng)。

如果是則進(jìn)入步驟405,如果否則進(jìn)入步驟404。

在本實(shí)施例中,上述電子設(shè)備可以先判斷用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程是否已經(jīng)啟動(dòng),如果是,則可以調(diào)用查詢線程,根據(jù)推送周期周期性地查詢數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。如果上述推送線程未啟動(dòng),那么可以啟動(dòng)上述推送線程。

步驟404,啟動(dòng)用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程。

在本實(shí)施例中,上述電子設(shè)備啟動(dòng)用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程,同時(shí),可以記錄已經(jīng)啟動(dòng)了上述線程,以備后續(xù)線程狀態(tài)的查詢。在需要時(shí),例如推送線程過多服務(wù)器處理壓力過大時(shí),也可以選擇暫停部分推送線程。

步驟405,根據(jù)推送周期周期性地查詢數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例中,上述電子設(shè)備啟動(dòng)的推送線程會(huì)調(diào)用查詢線程,查詢線程根據(jù)步驟402中得到的推送周期,周期性地查詢步驟402中得到的數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),可以將實(shí)時(shí)數(shù)據(jù)放入數(shù)據(jù)隊(duì)列中,以供推送線程使用。查詢到實(shí)時(shí)數(shù)據(jù)后也可以先將其與上一次查詢到的實(shí)時(shí)數(shù)據(jù)作比較,判斷是否存在數(shù)據(jù)異常的情況,例如變化的幅度與預(yù)期值相差過大。如果存在數(shù)據(jù)異常的情況,可以向系統(tǒng)管理者推送數(shù)據(jù)異常信息,先不將查詢到的數(shù)據(jù)放入數(shù)據(jù)隊(duì)列中,直到數(shù)據(jù)正常后再將查詢到的數(shù)據(jù)放入數(shù)據(jù)隊(duì)列中。

通常,服務(wù)器的緩存數(shù)據(jù)會(huì)存于redis數(shù)據(jù)庫中,例如,一個(gè)網(wǎng)購類網(wǎng)站或應(yīng)用,其每成交一個(gè)訂單,訂單號可以存入一個(gè)列表中,可以根據(jù)推送周期周期性地查詢上述列表中訂單號的個(gè)數(shù),以此可以訂單量數(shù)據(jù)的實(shí)時(shí)獲取。

在下文中,將以常用的程序設(shè)計(jì)語言java為例,闡述如何實(shí)現(xiàn)在每一個(gè)整秒進(jìn)行查詢:

1、獲取當(dāng)前時(shí)間的下一個(gè)整秒,將其設(shè)置為上次執(zhí)行時(shí)間。可以預(yù)先定義一個(gè)長整型(long)變量,可將其命名為lastexectime,用于存放上次執(zhí)行時(shí)間。通過函數(shù)system.currenttimemillis()獲取當(dāng)前時(shí)間,currenttimemillis()為java編程語言的一種計(jì)時(shí)方法,從早期版本起它就是標(biāo)準(zhǔn)api的一部分,其中system類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部,system類位于java.lang包,java.lang包包含著java最基礎(chǔ)和核心的類,在編譯時(shí)會(huì)自動(dòng)導(dǎo)入。system.currenttimemillis()返回值時(shí)間的表達(dá)格式為當(dāng)前計(jì)算機(jī)時(shí)間和gmt時(shí)間(格林威治時(shí)間)1970年1月1號0時(shí)0分0秒所差的毫秒數(shù)。當(dāng)前時(shí)間先對1000求余,用當(dāng)前時(shí)間減去上述求余得到的的余數(shù)再加1000,將計(jì)算結(jié)果賦給變量lastexectime。

2、進(jìn)入循環(huán),預(yù)先定義一個(gè)長整型(long)變量,可將其命名為curttime,用于存放當(dāng)前時(shí)間。將system.currenttimemillis()返回值賦給變量curttime。之后判斷變量curttime的值與變量lastexectime的值之差是否能整除1000,如果能,且當(dāng)前推送線程沒有暫停,則查詢數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),并將lastexectime的值更新為curttime的值。

步驟406,通過上述連接向客戶端推送實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例中,上述電子設(shè)備可以在步驟404得到實(shí)時(shí)數(shù)據(jù)后立即通過步驟401中建立的連接向客戶端推送實(shí)時(shí)數(shù)據(jù)。

從圖4中可以看出,與圖2對應(yīng)的實(shí)施例相比,本實(shí)施例中的實(shí)時(shí)數(shù)據(jù)推送方法的流程400突出了線程管理的步驟。由此,本實(shí)施例描述的方案可以通過同時(shí)運(yùn)行多個(gè)推送線程,實(shí)現(xiàn)不同的實(shí)時(shí)數(shù)據(jù)的同時(shí)查詢,令上述電子設(shè)備更高效化,從而實(shí)現(xiàn)更全面的實(shí)時(shí)數(shù)據(jù)推送。

進(jìn)一步參考圖5,作為對上述各圖所示方法的實(shí)現(xiàn),本申請?zhí)峁┝艘环N實(shí)時(shí)數(shù)據(jù)推送裝置的一個(gè)實(shí)施例,該裝置實(shí)施例與圖2所示的方法實(shí)施例相對應(yīng),該裝置具體可以應(yīng)用于各種電子設(shè)備中。

如圖5所示,本實(shí)施例上述的實(shí)時(shí)數(shù)據(jù)推送裝置500包括:連接 建立單元501、獲取單元502、查詢單元503和推送單元504。其中,連接建立單元501,配置用于響應(yīng)客戶端發(fā)送的連接請求,與上述客戶端建立支持全雙工通信的連接;獲取單元502配置用于獲取客戶端發(fā)送的推送請求,其中上述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期;查詢單元503配置用于根據(jù)上述推送周期周期性地查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);而推送單元504配置用于通過上述連接向客戶端推送上述實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例中,實(shí)時(shí)數(shù)據(jù)推送裝置500的連接建立單元501可以首先接收客戶端發(fā)送的連接請求,連接請求可以是通過http發(fā)送的。同時(shí),連接請求需表明請求建立的連接是支持全雙工通信的,即連接使用的是一種雙向通信協(xié)議。上述全雙工通信、雙向通信是指在建立連接后,服務(wù)器和客戶端都能主動(dòng)的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)。隨后,連接建立單元501響應(yīng)接收到的連接請求,通常是返回?cái)?shù)據(jù)表示已經(jīng)接受到連接請求,連接成功建立。

在本實(shí)施例中,獲取單元502可以通過連接建立單元501建立的連接獲取客戶端發(fā)送的推送請求,其中上述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期。如果推送請求中不包括數(shù)據(jù)的推送周期,也可以使用缺省的推送周期,例如一秒。

在本實(shí)施例中,查詢單元503可以根據(jù)獲取單元502得到的推送周期,周期性地查詢獲取單元502得到的數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。通常,實(shí)時(shí)數(shù)據(jù)保存在數(shù)據(jù)庫中,例如,redis數(shù)據(jù)庫,redis數(shù)據(jù)庫是一個(gè)開源的支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、key-value數(shù)據(jù)庫,并提供多種語言的api。查詢到的數(shù)據(jù)可以加入消息隊(duì)列中,以備推送步驟取用。具體的可以利用redis數(shù)據(jù)庫中列表“l(fā)ists”這種數(shù)據(jù)結(jié)構(gòu),來實(shí)現(xiàn)消息隊(duì)列,使用push指令存入查詢線程查詢到的數(shù)據(jù),使用pop指令使得推送線程可以獲取消息隊(duì)列中查詢線程查詢到的數(shù)據(jù)。

在本實(shí)施例中,推送單元504可以通過連接建立單元501建立的連接向客戶端推送查詢單元503查詢到的實(shí)時(shí)數(shù)據(jù)。由于連接建立單元501建立的連接支持全雙工通信,所以連接建立后,只需等待觸發(fā) 事件發(fā)生,而不需客戶端定期向服務(wù)器輪詢,可以通過添加回調(diào)函數(shù)來監(jiān)聽觸發(fā)事件,觸發(fā)事件發(fā)生后服務(wù)器能主動(dòng)向客戶端推送數(shù)據(jù),而不需要響應(yīng)于客戶端再次發(fā)送的請求才能推送數(shù)據(jù)。例如,觸發(fā)事件是當(dāng)前時(shí)間點(diǎn)是一個(gè)整秒,在服務(wù)器與客戶端之間已經(jīng)建立了websocket連接的情況下,當(dāng)服務(wù)器判斷出當(dāng)前時(shí)間點(diǎn)是一個(gè)整秒時(shí),服務(wù)器可以直接向客戶端推送數(shù)據(jù)。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述連接包括websocket連接;以及上述推送單元504,進(jìn)一步配置用于通過上述websocket連接向客戶端推送上述實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述推送周期為一秒;以及上述查詢單元503,進(jìn)一步配置用于:判斷是否是獲取上述推送請求后首次查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);如果是,則獲取當(dāng)前時(shí)間;響應(yīng)于當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)一致,查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù),其中,上述時(shí)間點(diǎn)包括當(dāng)前時(shí)間的下一個(gè)整秒;如果否,則獲取當(dāng)前時(shí)間;判斷上述當(dāng)前時(shí)間與上一次查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的時(shí)間的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述推送周期為一秒;以及上述查詢單元503,進(jìn)一步配置用于:獲取當(dāng)前時(shí)間;判斷上述當(dāng)前時(shí)間與預(yù)先設(shè)置的時(shí)間點(diǎn)的時(shí)間差是否為一秒的整數(shù)倍;如果是,則查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

在本實(shí)施例的一些可選的實(shí)現(xiàn)方式中,上述查詢單元503,進(jìn)一步配置用于:判斷用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程是否已經(jīng)啟動(dòng);如果否則啟動(dòng)用于根據(jù)上述推送周期周期性地推送上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)的推送線程;根據(jù)上述推送周期周期性地查詢上述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù)。

下面參考圖6,其示出了適于用來實(shí)現(xiàn)本申請實(shí)施例的服務(wù)器的計(jì)算機(jī)系統(tǒng)600的結(jié)構(gòu)示意圖。

如圖6所示,計(jì)算機(jī)系統(tǒng)600包括中央處理單元(cpu)601,其 可以根據(jù)存儲在只讀存儲器(rom)602中的程序或者從存儲部分608加載到隨機(jī)訪問存儲器(ram)603中的程序而執(zhí)行各種適當(dāng)?shù)膭?dòng)作和處理。在ram603中,還存儲有系統(tǒng)600操作所需的各種程序和數(shù)據(jù)。cpu601、rom602以及ram603通過總線604彼此相連。輸入/輸出(i/o)接口605也連接至總線604。

以下部件連接至i/o接口605:包括鍵盤、鼠標(biāo)等的輸入部分606;包括諸如陰極射線管(crt)、液晶顯示器(lcd)等以及揚(yáng)聲器等的輸出部分607;包括硬盤等的存儲部分608;以及包括諸如lan卡、調(diào)制解調(diào)器等的網(wǎng)絡(luò)接口卡的通信部分609。通信部分609經(jīng)由諸如因特網(wǎng)的網(wǎng)絡(luò)執(zhí)行通信處理。驅(qū)動(dòng)器610也根據(jù)需要連接至i/o接口605??刹鹦督橘|(zhì)611,諸如磁盤、光盤、磁光盤、半導(dǎo)體存儲器等等,根據(jù)需要安裝在驅(qū)動(dòng)器610上,以便于從其上讀出的計(jì)算機(jī)程序根據(jù)需要被安裝入存儲部分608。

特別地,根據(jù)本公開的實(shí)施例,上文參考流程圖描述的過程可以被實(shí)現(xiàn)為計(jì)算機(jī)軟件程序。例如,本公開的實(shí)施例包括一種計(jì)算機(jī)程序產(chǎn)品,其包括有形地包含在機(jī)器可讀介質(zhì)上的計(jì)算機(jī)程序,所述計(jì)算機(jī)程序包含用于執(zhí)行流程圖所示的方法的程序代碼。在這樣的實(shí)施例中,該計(jì)算機(jī)程序可以通過通信部分609從網(wǎng)絡(luò)上被下載和安裝,和/或從可拆卸介質(zhì)611被安裝。

附圖中的流程圖和框圖,圖示了按照本申請各種實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。

作為另一方面,本申請還提供了一種非易失性計(jì)算機(jī)存儲介質(zhì),該非易失性計(jì)算機(jī)存儲介質(zhì)可以是上述實(shí)施例中所述裝置中所包含的非易失性計(jì)算機(jī)存儲介質(zhì);也可以是單獨(dú)存在,未裝配入終端中的非易失性計(jì)算機(jī)存儲介質(zhì)。上述非易失性計(jì)算機(jī)存儲介質(zhì)存儲有一個(gè)或者多個(gè)程序,當(dāng)所述一個(gè)或者多個(gè)程序被一個(gè)設(shè)備執(zhí)行時(shí),使得所述設(shè)備:響應(yīng)客戶端發(fā)送的連接請求,與所述客戶端建立支持全雙工通信的連接;獲取客戶端發(fā)送的推送請求,其中所述推送請求包括數(shù)據(jù)名稱以及數(shù)據(jù)的推送周期;根據(jù)所述推送周期周期性地查詢所述數(shù)據(jù)名稱對應(yīng)的實(shí)時(shí)數(shù)據(jù);通過所述連接向客戶端推送所述實(shí)時(shí)數(shù)據(jù)。

以上描述僅為本申請的較佳實(shí)施例以及對所運(yùn)用技術(shù)原理的說明。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,本申請中所涉及的發(fā)明范圍,并不限于上述技術(shù)特征的特定組合而成的技術(shù)方案,同時(shí)也應(yīng)涵蓋在不脫離所述發(fā)明構(gòu)思的情況下,由上述技術(shù)特征或其等同特征進(jìn)行任意組合而形成的其它技術(shù)方案。例如上述特征與本申請中公開的(但不限于)具有類似功能的技術(shù)特征進(jìn)行互相替換而形成的技術(shù)方案。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
山阴县| 涟源市| 兰坪| 师宗县| 富宁县| 久治县| 深圳市| 柞水县| 海伦市| 长子县| 类乌齐县| 西充县| 睢宁县| 广东省| 南城县| 垦利县| 垫江县| 龙山县| 清流县| 永昌县| 辛集市| 宝坻区| 五大连池市| 图们市| 外汇| 龙游县| 四川省| 磐安县| 安龙县| 孟连| 禹城市| 南宁市| 迁西县| 卢湾区| 左云县| 汾西县| 陆丰市| 临洮县| 乌鲁木齐市| 宜兴市| 襄垣县|