本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其是一種消息輪詢方法和服務(wù)器、通信系統(tǒng)。
背景技術(shù):
隨著3G和Wifi技術(shù)的普及,以及長(zhǎng)期演進(jìn)(Long Time Evolution,LTE)的發(fā)展,終端設(shè)備側(cè)的帶寬越來(lái)越大,用戶的流量也逐漸增多。對(duì)于互聯(lián)網(wǎng)的需求已經(jīng)不局限于瀏覽網(wǎng)頁(yè)、查看新聞,而是提出多樣化的需求,例如網(wǎng)絡(luò)游戲、視頻電話等,因此,越來(lái)越多的應(yīng)用和業(yè)務(wù)需要應(yīng)用服務(wù)器直接把消息推送到終端設(shè)備上的應(yīng)用客戶端,從而極大的豐富了人們的生活,使人們獲取更好的用戶體驗(yàn)。
在應(yīng)用服務(wù)器和終端設(shè)備之間的消息傳遞,通常包括拉取(Pull)和推送(Push)兩種。其中,Pull是終端設(shè)備上的應(yīng)用客戶端到應(yīng)用服務(wù)器去獲取消息;而Push是應(yīng)用服務(wù)器主動(dòng)發(fā)送消息到終端設(shè)備上的應(yīng)用客戶端,具備主動(dòng)性與時(shí)效性。
目前,消息推送服務(wù)使用的方式是在應(yīng)用客戶端與應(yīng)用服務(wù)器之間保持長(zhǎng)連接,即:就是在客戶端與服務(wù)端之間創(chuàng)建和保持穩(wěn)定可靠的連接;應(yīng)用服務(wù)器產(chǎn)生新消息時(shí),由應(yīng)用服務(wù)器向應(yīng)用客戶端推送消息,該方式能夠保證消息推送的及時(shí)性及應(yīng)用客戶端高并發(fā)性。
然而,在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn),目前消息推送服務(wù)使用的方式至少存在以下問(wèn)題:
目前應(yīng)用客戶端規(guī)模較大,其中有相當(dāng)數(shù)量的應(yīng)用客戶端不能使用長(zhǎng)連接,則該部分不能使用長(zhǎng)連接的客戶端便無(wú)法接收到應(yīng)用服務(wù)器推送的新消息,從而限定了互聯(lián)網(wǎng)應(yīng)用和業(yè)務(wù)的發(fā)展。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例所要解決的其中一個(gè)技術(shù)問(wèn)題是,提供一種消息輪詢方法和服務(wù)器、通信系統(tǒng),以解決現(xiàn)有技術(shù)中不能使用長(zhǎng)連接的客戶端便無(wú)法接收到應(yīng)用服務(wù)器推送的新消息的問(wèn)題。
根據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供的一種消息輪詢方法,包括:
接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間。
在基于上述方法的另一個(gè)實(shí)施例中,所述從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息包括:
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和所述客戶端發(fā)送的、所述請(qǐng)求推送時(shí)間對(duì)應(yīng)的已接收消息列表,查詢消息隊(duì)列中是否存在推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息;
若存在,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息;所述第二推送時(shí)間具體為所述第一推送時(shí)間;
否則,若不存在,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息。
在基于上述方法的另一個(gè)實(shí)施例中,所述從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息包括:
以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息中,獲取不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
在基于上述方法的另一個(gè)實(shí)施例中,所述從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息包括:
以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間、不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
在基于上述方法的另一個(gè)實(shí)施例中,所述從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息還包括:
若消息隊(duì)列中不存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息,向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括所述第一推送時(shí)間和新消息列表,所述新消息列表為空。
在基于上述方法的另一個(gè)實(shí)施例中,還包括:
實(shí)時(shí)或周期性地從消息發(fā)布平臺(tái)拉取該消息發(fā)布平臺(tái)新生成的消息;
按照拉取時(shí)間順序?yàn)槔〉南⒎峙渫扑蜁r(shí)間,并將分配推送時(shí)間的消息插入所述消息隊(duì)列。
在基于上述方法的另一個(gè)實(shí)施例中,為拉取的消息分配的推送時(shí)間具體為將該消息插入所述消息隊(duì)列的時(shí)間。
在基于上述方法的另一個(gè)實(shí)施例中,所述將分配推送時(shí)間的消息插入所述消息隊(duì)列包括:按照推送時(shí)間由大到小或者有小到大的順序,將分配推送時(shí)間的消息插入所述消息隊(duì)列。
根據(jù)本發(fā)明實(shí)施例的另一個(gè)方面,提供的一種消息輪詢服務(wù)器,包括:
接收單元,用于接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
第一存儲(chǔ)單元,用于存儲(chǔ)消息隊(duì)列;
獲取單元,用于根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間;
發(fā)送單元,用于向客戶端反饋所述響應(yīng)消息。
根據(jù)本發(fā)明實(shí)施例的又一個(gè)方面,提供的一種通信系統(tǒng),包括客戶端和上述任一實(shí)施例的消息輪詢服務(wù)器;
所述客戶端,用于向所述消息輪詢服務(wù)器發(fā)送消息獲取請(qǐng)求,并接收所述消息輪詢服務(wù)器反饋的響應(yīng)消息;
所述消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
所述響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間。
基于本發(fā)明上述實(shí)施例提供的消息輪詢方法和服務(wù)器、通信系統(tǒng),可以由客戶端發(fā)送消息獲取請(qǐng)求,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向該客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。本發(fā)明實(shí)施例提供了一種客戶端從應(yīng)用服務(wù)器獲取新消息的新的技術(shù)方案,基于該技術(shù)方案,不能使用長(zhǎng)連接的客戶端也可以從應(yīng)用服務(wù)器獲得新消息,從而促進(jìn)了互聯(lián)網(wǎng)應(yīng)用和業(yè)務(wù)的發(fā)展。
下面通過(guò)附圖和實(shí)施例,對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。
附圖說(shuō)明
構(gòu)成說(shuō)明書(shū)的一部分的附圖描述了本發(fā)明的實(shí)施例,并且連同描述一起用于解釋本發(fā)明的原理。
參照附圖,根據(jù)下面的詳細(xì)描述,可以更加清楚地理解本發(fā)明,其中:
圖1為本發(fā)明消息輪詢方法一個(gè)實(shí)施例的流程圖。
圖2為本發(fā)明消息輪詢方法另一個(gè)實(shí)施例的流程圖。
圖3為本發(fā)明消息輪詢方法又一個(gè)實(shí)施例的流程圖。
圖4為本發(fā)明消息輪詢服務(wù)器一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。
圖5為本發(fā)明消息輪詢服務(wù)器另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。
圖6為本發(fā)明通信系統(tǒng)一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。
具體實(shí)施方式
現(xiàn)在將參照附圖來(lái)詳細(xì)描述本發(fā)明的各種示例性實(shí)施例。應(yīng)注意到:除非另外具體說(shuō)明,否則在這些實(shí)施例中闡述的部件和步驟的相對(duì)布置、數(shù)字表達(dá)式和數(shù)值不限制本發(fā)明的范圍。
同時(shí),應(yīng)當(dāng)明白,為了便于描述,附圖中所示出的各個(gè)部分的尺寸并不是按照實(shí)際的比例關(guān)系繪制的。
以下對(duì)至少一個(gè)示例性實(shí)施例的描述實(shí)際上僅僅是說(shuō)明性的,決不作為對(duì)本發(fā)明及其應(yīng)用或使用的任何限制。
對(duì)于相關(guān)領(lǐng)域普通技術(shù)人員已知的技術(shù)、方法和設(shè)備可能不作詳細(xì)討論,但在適當(dāng)情況下,所述技術(shù)、方法和設(shè)備應(yīng)當(dāng)被視為說(shuō)明書(shū)的一部分。
應(yīng)注意到:相似的標(biāo)號(hào)和字母在下面的附圖中表示類似項(xiàng),因此,一旦某一項(xiàng)在一個(gè)附圖中被定義,則在隨后的附圖中不需要對(duì)其進(jìn)行進(jìn)一步討論。
圖1為本發(fā)明消息輪詢方法一個(gè)實(shí)施例的流程圖。如圖1所示,該實(shí)施例的消息輪詢方法包括:
102,接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表。
其中,請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)(ID),其中的消息ID唯一標(biāo)識(shí)一條消息。
示例性地,在客戶端首次發(fā)送的獲取請(qǐng)求中,請(qǐng)求推送時(shí)間為預(yù)設(shè)的非時(shí)間數(shù)值,例如為0;已接收消息列表為空。
104,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表。
其中,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。
可選地,客戶端接收到響應(yīng)消息時(shí),若新消息列表中存在新消息,可以根據(jù)新消息列表中的新消息執(zhí)行相應(yīng)操作。
基于本發(fā)明上述實(shí)施例提供的消息輪詢的方法,可以由客戶端發(fā)送消息獲取請(qǐng)求,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向該客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。本發(fā)明實(shí)施例提供了一種客戶端從應(yīng)用服務(wù)器獲取新消息的新的技術(shù)方案,基于該技術(shù)方案,不能使用長(zhǎng)連接的客戶端也可以從應(yīng)用服務(wù)器獲得新消息,從而促進(jìn)了互聯(lián)網(wǎng)應(yīng)用和業(yè)務(wù)的發(fā)展。
圖2為本發(fā)明消息輪詢方法另一個(gè)實(shí)施例的流程圖。如圖2所示,該實(shí)施例的消息輪詢方法包括:
202,接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表。
其中,請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)(ID),其中的消息ID唯一標(biāo)識(shí)一條消息。
204,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和客戶端發(fā)送的、請(qǐng)求推送時(shí)間對(duì)應(yīng)的已接收消息列表,查詢消息隊(duì)列中是否存在推送時(shí)間為該請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息。
若存在,執(zhí)行操作206。否則,若不存在,執(zhí)行操作208。
206,從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息。
之后,執(zhí)行操作210。
208,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息。
210,向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表。
其中,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。
其中,在操作206中,第二推送時(shí)間具體為第一推送時(shí)間。
在實(shí)際應(yīng)用中,基于負(fù)載均衡、消息發(fā)送成功率和發(fā)送效率,可以限制每次向給客戶端發(fā)送的新消息數(shù)量。具體地,可以預(yù)先設(shè)置預(yù)設(shè)單次消息發(fā)送數(shù)量,例如100條。則在本發(fā)明另一實(shí)施例的消息輪詢方法中,圖2所示實(shí)施例的操作206中,具體以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息中,獲取不大于預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。即:若消息隊(duì)列中推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息數(shù)量大于或等于100條,則從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的100條新消息作為本次向客戶端下發(fā)的新消息;若消息隊(duì)列中推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息數(shù)量小于100條,則從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的全部新消息作為本次向客戶端下發(fā)的新消息。
同樣地,圖2所示實(shí)施例的操作208中,具體以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間、不大于預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。即:若消息隊(duì)列中推送時(shí)間為晚于請(qǐng)求推送時(shí)間、且最接近請(qǐng)求推送時(shí)間的一個(gè)推送時(shí)間的新消息數(shù)量大于或等于100條,則從該新消息中獲取100條作為本次向客戶端下發(fā)的新消息;若消息隊(duì)列中推送時(shí)間為晚于請(qǐng)求推送時(shí)間、最接近請(qǐng)求推送時(shí)間的一個(gè)推送時(shí)間的新消息數(shù)量小于100條,則獲取推送時(shí)間為晚于請(qǐng)求推送時(shí)間、且最接近請(qǐng)求推送時(shí)間的一個(gè)推送時(shí)間的所有新消息作為本次向客戶端下發(fā)的新消息。
在本發(fā)明又一實(shí)施例的消息輪詢方法中,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),還可以包括:
若消息隊(duì)列中不存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息,向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第一推送時(shí)間和新消息列表,其中的新消息列表為空。
進(jìn)一步地,在本發(fā)明上述各消息輪詢方法實(shí)施例的流程之前,還可以包括:
實(shí)時(shí)或周期性地從消息發(fā)布平臺(tái)拉取該消息發(fā)布平臺(tái)新生成的消息;
按照拉取時(shí)間順序?yàn)槔〉南⒎峙渫扑蜁r(shí)間,并將分配推送時(shí)間的消息插入消息隊(duì)列,以便推送給客戶端。
具體地,為拉取的消息分配的推送時(shí)間具體可以是將該消息插入消息隊(duì)列的時(shí)間。
為了節(jié)省存儲(chǔ)資源,可以定期對(duì)該消息列隊(duì)中推送時(shí)間較早的消息進(jìn)行清理。
示例性地,將分配推送時(shí)間的消息插入消息隊(duì)列例如可以是:按照推送時(shí)間由大到小或者有小到大的順序,將分配推送時(shí)間的消息插入消息隊(duì)列。
則在本發(fā)明上述實(shí)施例中,還包括:
比較消息隊(duì)列的尾部或頭部是否存在推送時(shí)間大于第一推送時(shí)間的消息;
若消息隊(duì)列的尾部或頭部存在推送時(shí)間大于第一推送時(shí)間的消息,則確定消息隊(duì)列中存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息;
相應(yīng)地,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息具體為:從消息隊(duì)列的尾部或頭部獲取推送時(shí)間大于第一推送時(shí)間的消息作為本次向客戶端下發(fā)的新消息;
否則,若消息隊(duì)列的尾部或頭部不存在推送時(shí)間大于第一推送時(shí)間的消息,則確定消息隊(duì)列中不存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息。
在本發(fā)明消息輪詢方法的又一個(gè)實(shí)施例中,客戶端發(fā)送的消息獲取請(qǐng)求中還可以包括用于唯一標(biāo)識(shí)一個(gè)客戶端的客戶端ID。相應(yīng)地,該實(shí)施例的消息輪詢方法還包括:
接收到客戶端首次發(fā)送的獲取請(qǐng)求后,在消息推送信息列表中建立客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系;
并在每次接收到客戶端發(fā)送的消息獲取請(qǐng)求后,基于接收到的消息獲取請(qǐng)求對(duì)消息推送信息列表進(jìn)行更新;
則上述各實(shí)施例中,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息包括:根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間、已接收消息列表和客戶端ID,查詢消息推送信息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息。
進(jìn)一步地,在本發(fā)明消息輪詢方法的再一個(gè)實(shí)施例中,可以預(yù)先根據(jù)消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期。相應(yīng)地,在發(fā)送給客戶端的響應(yīng)消息中還可以包括輪詢周期。相應(yīng)地,各實(shí)施例的消息輪詢方法還包括:
客戶端接收到響應(yīng)消息后,以輪詢周期作為計(jì)時(shí)時(shí)長(zhǎng)開(kāi)始計(jì)時(shí),并在計(jì)時(shí)器超時(shí)時(shí),生成消息獲取請(qǐng)求并發(fā)送消息輪詢服務(wù)器。
根據(jù)消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期的具體方式,可以是:消息輪詢服務(wù)器的負(fù)載越大,輪詢周期越大;消息隊(duì)列中新消息的數(shù)量越大,輪詢周期越小。
具體地,根據(jù)消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期的方式可以是:在消息隊(duì)列中存在新消息時(shí),將輪詢周期設(shè)置為預(yù)設(shè)周期;在消息隊(duì)列中不存在新消息時(shí),根據(jù)連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù)的增加,按照預(yù)設(shè)方式逐漸增大輪詢周期。
因?yàn)槊刻斓男孪⒍际怯邢薜?,因此,如果有新消息,也?huì)在幾輪請(qǐng)求、響應(yīng)中推送完畢,因此大部分時(shí)間,客戶端的輪詢都是空輪詢,沒(méi)有新消息。本發(fā)明實(shí)施例根據(jù)消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量更新輪詢周期,在服務(wù)端負(fù)載較大時(shí),增大輪詢周期,可以滿足更多的客戶端接入服務(wù)器;在消息隊(duì)列中新消息的數(shù)量少時(shí),增大輪詢周期,既可以滿足消息推送需求,還可以避免沒(méi)有新消息時(shí)客戶方與服務(wù)器進(jìn)行信息交互,避免了由此導(dǎo)致的客戶端與服務(wù)器負(fù)載的增加、對(duì)客戶端與服務(wù)器工作性能的影響和占用的無(wú)線通信資源;而在服務(wù)端負(fù)載較小、消息隊(duì)列中新消息的數(shù)量較多時(shí),采用較小的輪詢周期,可以在不影響服務(wù)器工作性能的情況下,將新消息快速推送給客戶端。
圖3為本發(fā)明消息輪詢方法又一個(gè)實(shí)施例的流程圖。該實(shí)施例以一個(gè)具體應(yīng)用實(shí)例為例,對(duì)本發(fā)明各實(shí)施例的消息輪詢方法進(jìn)行進(jìn)一步說(shuō)明,該實(shí)施例的流程具體可以通過(guò)一個(gè)消息輪詢服務(wù)器或具有類似功能的裝置實(shí)現(xiàn)。如圖3所示,該實(shí)施例的消息輪詢方法包括:
302,客戶端首次發(fā)送獲取請(qǐng)求,其中包括:客戶端ID,請(qǐng)求推送時(shí)間為0(即:pre_push_time=0),已接收消息列表為空(即:recv_id_set=null)。
304,消息輪詢服務(wù)器在消息推送信息列表中建立客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系,并查詢消息隊(duì)列中是否存在新消息。
若不存在,執(zhí)行操作306。若存在,執(zhí)行操作310。
306,消息輪詢服務(wù)器向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括:推送時(shí)間為空(即:push_time=null)、新消息列表為空(即:msg_set=null)和預(yù)先設(shè)置的輪詢周期T。
308,客戶端接收到響應(yīng)消息后,設(shè)置輪詢周期T,并以該輪詢周期T作為計(jì)時(shí)時(shí)長(zhǎng)開(kāi)始計(jì)時(shí),在計(jì)時(shí)器超時(shí)時(shí),生成消息獲取請(qǐng)求并發(fā)送給消息輪詢服務(wù)器。
消息獲取請(qǐng)求中,請(qǐng)求推送時(shí)間為0(即:pre_push_time=0),已接收消息列表為空(即:recv_id_set=null)。
之后,執(zhí)行操作304。
310,消息輪詢服務(wù)器識(shí)別消息隊(duì)列中推送時(shí)間push_time最早的(假設(shè):推送時(shí)間最早的push_time=m)的新消息數(shù)量是否小于預(yù)設(shè)單次消息發(fā)送數(shù)量。
若小于預(yù)設(shè)單次消息發(fā)送數(shù)量,執(zhí)行操作312。否則,若大于或等于預(yù)設(shè)單次消息發(fā)送數(shù)量,執(zhí)行操作314。
312,消息輪詢服務(wù)器從消息隊(duì)列中獲取推送時(shí)間push_time=m的所有新消息作為本次向客戶端下發(fā)的新消息,即:新消息列表中包括推送時(shí)間push_time=m的所有新消息的消息ID。
之后執(zhí)行操作316。
314,消息輪詢服務(wù)器從消息隊(duì)列中獲取推送時(shí)間為push_time=m、預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息,即:新消息列表中包括本次獲取的推送時(shí)間push_time=m、預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息的消息ID。
316,消息輪詢服務(wù)器向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括推送時(shí)間push_time=m、新消息列表msg_set={…}和輪詢周期T。
其中,消息輪詢服務(wù)器向一個(gè)客戶端首次反饋?lái)憫?yīng)消息中輪詢周期T的取值為預(yù)先設(shè)置的值,之后向一個(gè)客戶端首次反饋?lái)憫?yīng)消息中輪詢周期T的取值為消息輪詢服務(wù)器按照預(yù)設(shè)策略更新或不更新的值,例如,消息隊(duì)列中有新消息時(shí)輪詢周期T的取值繼續(xù)采用預(yù)先設(shè)置的值,向該客戶端的新消息推送完成后輪詢周期T的取值采用一個(gè)被更新的較大值。
318,客戶端接收到響應(yīng)消息后,接收新消息列表中的新消息,生成已接收消息列表recv_id_set={…},并基于各新消息執(zhí)行相應(yīng)操作,例如向客戶端所在的移動(dòng)終端彈出消息提示、安裝相應(yīng)的插件等,同時(shí)以該輪詢周期T作為計(jì)時(shí)時(shí)長(zhǎng)開(kāi)始計(jì)時(shí)。
320,在計(jì)時(shí)器超時(shí)時(shí),客戶端生成消息獲取請(qǐng)求并發(fā)送給消息輪詢服務(wù)器,該消息獲取請(qǐng)求中包括:客戶端ID,請(qǐng)求推送時(shí)間pre_push_time=m,已接收消息列表recv_id_set={…}。
322,消息輪詢服務(wù)器將推送時(shí)間push_time=m和已接收消息列表recv_id_set={…}更新到推送信息列表中該客戶端ID的對(duì)應(yīng)關(guān)系中,并根據(jù)該客戶端ID的對(duì)應(yīng)關(guān)系,查詢消息隊(duì)列中是否存在推送時(shí)間為pre_push_time=m、未向客戶端發(fā)送過(guò)的新消息。
若存在,執(zhí)行操作324。否則,若不存在,執(zhí)行操作330。
324,消息輪詢服務(wù)器識(shí)別推送時(shí)間為push_time=m、未向客戶端發(fā)送過(guò)的新消息數(shù)量是否小于預(yù)設(shè)單次消息發(fā)送數(shù)量。
若小于預(yù)設(shè)單次消息發(fā)送數(shù)量,執(zhí)行操作326。否則,若大于或等于預(yù)設(shè)單次消息發(fā)送數(shù)量,執(zhí)行操作328。
326,消息輪詢服務(wù)器根據(jù)推送信息列表中該客戶端ID的對(duì)應(yīng)關(guān)系,從消息隊(duì)列中獲取推送時(shí)間為push_time=m、未向客戶端發(fā)送過(guò)的全部新消息作為本次向客戶端下發(fā)的新消息。
之后,執(zhí)行操作316。
328,消息輪詢服務(wù)器根據(jù)推送信息列表中該客戶端ID的對(duì)應(yīng)關(guān)系,從消息隊(duì)列中推送時(shí)間為push_time=m、未向客戶端發(fā)送過(guò)的新消息中獲取預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
之后,執(zhí)行操作316。
330,消息輪詢服務(wù)器按照推送時(shí)間的先后順序,查詢消息隊(duì)列中是否存在推送時(shí)間晚于push_time=m的新消息。
若存在,假設(shè)推送時(shí)間晚于push_time=m且最接近push_time=m的push_time=n,則以push_time=n代替push_time=m作為推送時(shí)間,開(kāi)始執(zhí)行操作310。否則,若不存在,按照預(yù)設(shè)規(guī)律增大輪詢周期T的值,然后執(zhí)行操作316,此時(shí),響應(yīng)消息中中,新消息列表為空,即:msg_set=null,輪詢周期T的取值大于預(yù)先設(shè)置的值。
在圖3所示的上述實(shí)施例中,在消息隊(duì)列中不存在新消息時(shí),統(tǒng)計(jì)連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù),隨著該連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù)的增加,按照預(yù)設(shè)方式逐漸增大輪詢周期。直至消息隊(duì)列中出現(xiàn)新消息時(shí),輪詢周期恢復(fù)預(yù)設(shè)設(shè)置的值,并對(duì)計(jì)數(shù)器清零,以便下次重新統(tǒng)計(jì)消息隊(duì)列中連續(xù)不存在新消息的次數(shù)。
圖4為本發(fā)明消息輪詢服務(wù)器一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。該實(shí)施例的消息輪詢服務(wù)器可用于實(shí)現(xiàn)本發(fā)明上述各實(shí)施例的消息輪詢方法。如圖4所示,該實(shí)施例的消息輪詢服務(wù)器包括:接收單元,第一存儲(chǔ)單元,獲取單元和發(fā)送單元。其中:
接收單元,用于接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息ID。
示例性地,在客戶端首次發(fā)送的獲取請(qǐng)求中,請(qǐng)求推送時(shí)間為預(yù)設(shè)的非時(shí)間數(shù)值,例如為0;已接收消息列表為空。
第一存儲(chǔ)單元,用于存儲(chǔ)消息隊(duì)列。
獲取單元,用于根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。
發(fā)送單元,用于向客戶端反饋?lái)憫?yīng)消息。
基于本發(fā)明上述實(shí)施例提供的消息輪詢服務(wù)器,可以由客戶端發(fā)送消息獲取請(qǐng)求,根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向該客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。本發(fā)明實(shí)施例提供了一種客戶端從應(yīng)用服務(wù)器獲取新消息的新的技術(shù)方案,基于該技術(shù)方案,不能使用長(zhǎng)連接的客戶端也可以從應(yīng)用服務(wù)器獲得新消息,從而促進(jìn)了互聯(lián)網(wǎng)應(yīng)用和業(yè)務(wù)的發(fā)展。
在上述消息輪詢服務(wù)器實(shí)施例的一個(gè)具體示例中,獲取單元從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),具體用于:
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和客戶端發(fā)送的、請(qǐng)求推送時(shí)間對(duì)應(yīng)的已接收消息列表,查詢消息隊(duì)列中是否存在推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息;
若存在,從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息,此時(shí)的第二推送時(shí)間具體為第一推送時(shí)間。具體地,獲取單元以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間為請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息中,獲取不大于預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息;
否則,若不存在,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息。具體地,獲取單元可以以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間、不大于預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
進(jìn)一步地,獲取單元從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),還用于在消息隊(duì)列中不存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息時(shí),向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第一推送時(shí)間和新消息列表,新消息列表為空。
圖5為本發(fā)明消息輪詢服務(wù)器另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。如圖5所示,與圖4所示的實(shí)施例相比,該實(shí)施例的消息輪詢服務(wù)器還包括消息拉取單元,用于實(shí)時(shí)或周期性地從消息發(fā)布平臺(tái)拉取該消息發(fā)布平臺(tái)新生成的消息,并按照拉取時(shí)間順序?yàn)槔〉南⒎峙渫扑蜁r(shí)間,并將分配推送時(shí)間的消息插入消息隊(duì)列。
具體地,為拉取的消息分配的推送時(shí)間可以是將該消息插入消息隊(duì)列的時(shí)間。
在本發(fā)明消息輪詢服務(wù)器實(shí)施例的一個(gè)具體示例中,消息拉取單元將分配推送時(shí)間的消息插入消息隊(duì)列時(shí),具體用于按照推送時(shí)間由大到小或者有小到大的順序,將分配推送時(shí)間的消息插入消息隊(duì)列。
相應(yīng)地,在本發(fā)明消息輪詢服務(wù)器的又一個(gè)實(shí)施例中,獲取單元還用于:
比較消息隊(duì)列的尾部或頭部是否存在推送時(shí)間大于第一推送時(shí)間的消息;
若消息隊(duì)列的尾部或頭部存在推送時(shí)間大于第一推送時(shí)間的消息,則確定消息隊(duì)列中存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息;
按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息時(shí),具體用于從消息隊(duì)列的尾部或頭部獲取推送時(shí)間大于第一推送時(shí)間的消息作為本次向客戶端下發(fā)的新消息;
否則,若消息隊(duì)列的尾部或頭部不存在推送時(shí)間大于第一推送時(shí)間的消息,則確定消息隊(duì)列中不存在推送時(shí)間晚于請(qǐng)求推送時(shí)間的新消息。
進(jìn)一步地,消息獲取請(qǐng)求中還包括用于唯一標(biāo)識(shí)一個(gè)客戶端的客戶端ID。相應(yīng)地,在本發(fā)明消息輪詢服務(wù)器的再一個(gè)實(shí)施例中,服務(wù)器還包括:推送信息存儲(chǔ)單元和更新單元。其中:
推送信息存儲(chǔ)單元,用于存儲(chǔ)消息推送信息列表,消息推送信息列表包括客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系。
更新單元,用于在接收單元接收到客戶端首次發(fā)送的獲取請(qǐng)求后,在消息推送信息列表中建立客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系;并在每次接收到客戶端發(fā)送的消息獲取請(qǐng)求后,基于接收到的消息獲取請(qǐng)求對(duì)消息推送信息列表進(jìn)行更新;
相應(yīng)地,獲取單元根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),具體用于:根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間、已接收消息列表和客戶端ID,查詢消息推送信息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息。
進(jìn)一步地,在本發(fā)明上述各實(shí)施例的消息輪詢服務(wù)器中,響應(yīng)消息中還可以包括輪詢周期。
再參見(jiàn)圖5,消息輪詢服務(wù)器還可以包括設(shè)置單元,用于根據(jù)消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期。具體地,可以設(shè)置消息輪詢服務(wù)器的負(fù)載越大,輪詢周期越大;和/或消息隊(duì)列中新消息的數(shù)量越大,輪詢周期越小。
在其中一個(gè)具體示例中,設(shè)置單元根據(jù)消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期時(shí),具體用于:在消息隊(duì)列中存在新消息時(shí),將輪詢周期設(shè)置為預(yù)設(shè)周期;在消息隊(duì)列中不存在新消息時(shí),根據(jù)連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù)的增加,按照預(yù)設(shè)方式逐漸增大輪詢周期。
圖6為本發(fā)明通信系統(tǒng)一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。如圖6所示,該實(shí)施例的通信系統(tǒng)包括客戶端本發(fā)明上述任一實(shí)施例的消息輪詢服務(wù)器。其中:
客戶端,用于向消息輪詢服務(wù)器發(fā)送消息獲取請(qǐng)求,并接收消息輪詢服務(wù)器反饋的響應(yīng)消息。
其中,消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表,請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息ID。
響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。
基于本發(fā)明上述實(shí)施例提供的通信系統(tǒng),可以由客戶端發(fā)送消息獲取請(qǐng)求,消息輪詢服務(wù)器根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向該客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,第二推送時(shí)間為新消息的推送時(shí)間。本發(fā)明實(shí)施例提供了一種客戶端從應(yīng)用服務(wù)器獲取新消息的新的技術(shù)方案,基于該技術(shù)方案,不能使用長(zhǎng)連接的客戶端也可以從應(yīng)用服務(wù)器獲得新消息,從而促進(jìn)了互聯(lián)網(wǎng)應(yīng)用和業(yè)務(wù)的發(fā)展。
另外,在通信系統(tǒng)的另一個(gè)實(shí)施例中,響應(yīng)消息中包括輪詢周期時(shí),客戶端還用于接收到響應(yīng)消息后,以輪詢周期開(kāi)始計(jì)時(shí),并在計(jì)時(shí)器超時(shí)時(shí),生成消息獲取請(qǐng)求并發(fā)送消息輪詢服務(wù)器。
進(jìn)一步地,在本發(fā)明上述各實(shí)施例的通信系統(tǒng)中,客戶端還用于在接收到響應(yīng)消息時(shí),若新消息列表中存在新消息,根據(jù)新消息列表中的新消息執(zhí)行相應(yīng)操作。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過(guò)程序指令相關(guān)的硬件來(lái)完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:ROM、RAM、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。
本發(fā)明實(shí)施例提供了以下技術(shù)方案:
1、一種消息輪詢方法,包括:
接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,并向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間。
2、根據(jù)1所述的方法,所述從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息包括:
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和所述客戶端發(fā)送的、所述請(qǐng)求推送時(shí)間對(duì)應(yīng)的已接收消息列表,查詢消息隊(duì)列中是否存在推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息;
若存在,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息;所述第二推送時(shí)間具體為所述第一推送時(shí)間;
否則,若不存在,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息。
3、根據(jù)2所述的方法,所述從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息包括:
以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息中,獲取不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
4、根據(jù)2所述的方法,所述從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息包括:
以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間、不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
5、根據(jù)2至4任意一項(xiàng)所述的方法,所述從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息還包括:
若消息隊(duì)列中不存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息,向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括所述第一推送時(shí)間和新消息列表,所述新消息列表為空。
6、根據(jù)5所述的方法,還包括:
實(shí)時(shí)或周期性地從消息發(fā)布平臺(tái)拉取該消息發(fā)布平臺(tái)新生成的消息;
按照拉取時(shí)間順序?yàn)槔〉南⒎峙渫扑蜁r(shí)間,并將分配推送時(shí)間的消息插入所述消息隊(duì)列。
7、根據(jù)6所述的方法,為拉取的消息分配的推送時(shí)間具體為將該消息插入所述消息隊(duì)列的時(shí)間。
8、根據(jù)6或7所述的方法,所述將分配推送時(shí)間的消息插入所述消息隊(duì)列包括:按照推送時(shí)間由大到小或者有小到大的順序,將分配推送時(shí)間的消息插入所述消息隊(duì)列。
9、根據(jù)8所述的方法,還包括:
比較所述消息隊(duì)列的尾部或頭部是否存在推送時(shí)間大于所述第一推送時(shí)間的消息;
若所述消息隊(duì)列的尾部或頭部存在推送時(shí)間大于所述第一推送時(shí)間的消息,則確定消息隊(duì)列中存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息;
所述按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息包括:從所述消息隊(duì)列的尾部或頭部獲取推送時(shí)間大于所述第一推送時(shí)間的消息作為本次向客戶端下發(fā)的新消息;
否則,若所述消息隊(duì)列的尾部或頭部不存在推送時(shí)間大于所述第一推送時(shí)間的消息,則確定消息隊(duì)列中不存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息。
10、根據(jù)1至9任意一項(xiàng)所述的方法,客戶端首次發(fā)送的獲取請(qǐng)求中,所述請(qǐng)求推送時(shí)間為預(yù)設(shè)的非時(shí)間數(shù)值;所述已接收消息列表為空。
11、根據(jù)1至10任意一項(xiàng)所述的方法,所述消息獲取請(qǐng)求中還包括用于唯一標(biāo)識(shí)一個(gè)客戶端的客戶端ID;
所述方法還包括:
接收到客戶端首次發(fā)送的獲取請(qǐng)求后,在消息推送信息列表中建立客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系;
并在每次接收到客戶端發(fā)送的消息獲取請(qǐng)求后,基于接收到的消息獲取請(qǐng)求對(duì)所述消息推送信息列表進(jìn)行更新;
所述根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息包括:根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間、已接收消息列表和客戶端ID,查詢所述消息推送信息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息。
12、根據(jù)1至11任意一項(xiàng)所述的方法,所述響應(yīng)消息中還包括輪詢周期;
所述方法還包括:
客戶端接收到響應(yīng)消息后,以所述輪詢周期開(kāi)始計(jì)時(shí),并在計(jì)時(shí)器超時(shí)時(shí),生成所述消息獲取請(qǐng)求并發(fā)送消息輪詢服務(wù)器。
13、根據(jù)12所述的方法,還包括:
根據(jù)所述消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期。
14、根據(jù)13所述的方法,所述消息輪詢服務(wù)器的負(fù)載越大,所述輪詢周期越大;
所述消息隊(duì)列中新消息的數(shù)量越大,所述輪詢周期越小。
15、根據(jù)14所述的方法,所述根據(jù)消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期包括:
在消息隊(duì)列中存在新消息時(shí),將輪詢周期設(shè)置為預(yù)設(shè)周期;
在消息隊(duì)列中不存在新消息時(shí),根據(jù)連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù)的增加,按照預(yù)設(shè)方式逐漸增大輪詢周期。
16、根據(jù)1至15任意一項(xiàng)所述的方法,還包括:
客戶端接收到響應(yīng)消息時(shí),若新消息列表中存在新消息,根據(jù)新消息列表中的新消息執(zhí)行相應(yīng)操作。
17、一種消息輪詢服務(wù)器,包括:
接收單元,用于接收客戶端發(fā)送的消息獲取請(qǐng)求,該消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
第一存儲(chǔ)單元,用于存儲(chǔ)消息隊(duì)列;
獲取單元,用于根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息,該響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間;
發(fā)送單元,用于向客戶端反饋所述響應(yīng)消息。
18、根據(jù)17所述的服務(wù)器,所述獲取單元從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),具體用于:
根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和所述客戶端發(fā)送的、所述請(qǐng)求推送時(shí)間對(duì)應(yīng)的已接收消息列表,查詢消息隊(duì)列中是否存在推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息;
若存在,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息;所述第二推送時(shí)間具體為所述第一推送時(shí)間;
否則,若不存在,按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息。
19、根據(jù)18所述的服務(wù)器,所述獲取單元從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息作為本次向客戶端下發(fā)的新消息時(shí),具體用于以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間為所述請(qǐng)求推送時(shí)間的、未向客戶端發(fā)送過(guò)的新消息中,獲取不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
20、根據(jù)18所述的服務(wù)器,所述獲取單元從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息時(shí),具體用于以預(yù)設(shè)單次消息發(fā)送數(shù)量為單位,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間、不大于所述預(yù)設(shè)單次消息發(fā)送數(shù)量的新消息作為本次向客戶端下發(fā)的新消息。
21、根據(jù)18至20任意一項(xiàng)所述的服務(wù)器,所述獲取單元從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),還用于若消息隊(duì)列中不存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息,向客戶端反饋?lái)憫?yīng)消息,該響應(yīng)消息中包括所述第一推送時(shí)間和新消息列表,所述新消息列表為空。
22、根據(jù)21所述的服務(wù)器,還包括:
消息拉取單元,用于實(shí)時(shí)或周期性地從消息發(fā)布平臺(tái)拉取該消息發(fā)布平臺(tái)新生成的消息,并按照拉取時(shí)間順序?yàn)槔〉南⒎峙渫扑蜁r(shí)間,并將分配推送時(shí)間的消息插入所述消息隊(duì)列。
23、根據(jù)22所述的服務(wù)器,為拉取的消息分配的推送時(shí)間具體為將該消息插入所述消息隊(duì)列的時(shí)間。
24、根據(jù)22或23所述的服務(wù)器,所述消息拉取單元將分配推送時(shí)間的消息插入所述消息隊(duì)列時(shí),具體用于按照推送時(shí)間由大到小或者有小到大的順序,將分配推送時(shí)間的消息插入所述消息隊(duì)列。
25、根據(jù)24所述的服務(wù)器,所述獲取單元,還用于:
比較所述消息隊(duì)列的尾部或頭部是否存在推送時(shí)間大于所述第一推送時(shí)間的消息;
若所述消息隊(duì)列的尾部或頭部存在推送時(shí)間大于所述第一推送時(shí)間的消息,則確定消息隊(duì)列中存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息;
按照推送時(shí)間的先后順序,從消息隊(duì)列中獲取推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息作為本次向客戶端下發(fā)的新消息時(shí),具體用于從所述消息隊(duì)列的尾部或頭部獲取推送時(shí)間大于所述第一推送時(shí)間的消息作為本次向客戶端下發(fā)的新消息;
否則,若所述消息隊(duì)列的尾部或頭部不存在推送時(shí)間大于所述第一推送時(shí)間的消息,則確定消息隊(duì)列中不存在推送時(shí)間晚于所述請(qǐng)求推送時(shí)間的新消息。
26、根據(jù)17至25任意一項(xiàng)所述的服務(wù)器,客戶端首次發(fā)送的獲取請(qǐng)求中,所述請(qǐng)求推送時(shí)間為預(yù)設(shè)的非時(shí)間數(shù)值;所述已接收消息列表為空。
27、根據(jù)17至25任意一項(xiàng)所述的服務(wù)器,所述消息獲取請(qǐng)求中還包括用于唯一標(biāo)識(shí)一個(gè)客戶端的客戶端ID;
所述服務(wù)器還包括:
推送信息存儲(chǔ)單元,用于存儲(chǔ)消息推送信息列表,所述消息推送信息列表包括客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系;
更新單元,用于在接收單元接收到客戶端首次發(fā)送的獲取請(qǐng)求后,在消息推送信息列表中建立客戶端ID、推送時(shí)間與已接收消息列表之間的對(duì)應(yīng)關(guān)系;并在每次接收到客戶端發(fā)送的消息獲取請(qǐng)求后,基于接收到的消息獲取請(qǐng)求對(duì)所述消息推送信息列表進(jìn)行更新;
所述獲取單元根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間和已接收消息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息時(shí),具體用于:根據(jù)消息獲取請(qǐng)求中的請(qǐng)求推送時(shí)間、已接收消息列表和客戶端ID,查詢所述消息推送信息列表,從消息隊(duì)列中獲取未向客戶端發(fā)送過(guò)的新消息。
28、根據(jù)17至27任意一項(xiàng)所述的服務(wù)器,所述響應(yīng)消息中還包括輪詢周期。
29、根據(jù)28所述的服務(wù)器,還包括:
設(shè)置單元,用于根據(jù)所述消息輪詢服務(wù)器的負(fù)載和/或消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期。
30、根據(jù)29所述的服務(wù)器,所述消息輪詢服務(wù)器的負(fù)載越大,所述輪詢周期越大;
所述消息隊(duì)列中新消息的數(shù)量越大,所述輪詢周期越小。
31、根據(jù)30所述的服務(wù)器,所述設(shè)置單元根據(jù)消息隊(duì)列中新消息的數(shù)量設(shè)置輪詢周期時(shí),具體用于:
在消息隊(duì)列中存在新消息時(shí),將輪詢周期設(shè)置為預(yù)設(shè)周期;
在消息隊(duì)列中不存在新消息時(shí),根據(jù)連續(xù)多次查詢消息隊(duì)列中不存在新消息的次數(shù)的增加,按照預(yù)設(shè)方式逐漸增大輪詢周期。
32、一種通信系統(tǒng),包括客戶端和1至16任意一項(xiàng)所述的消息輪詢服務(wù)器;
所述客戶端,用于向所述消息輪詢服務(wù)器發(fā)送消息獲取請(qǐng)求,并接收所述消息輪詢服務(wù)器反饋的響應(yīng)消息;
所述消息獲取請(qǐng)求中包括請(qǐng)求推送時(shí)間和已接收消息列表;所述請(qǐng)求推送時(shí)間為客戶端上一次接收到服務(wù)器下發(fā)的上一響應(yīng)消息中的第一推送時(shí)間,所述已接收消息列表包括客戶端上一次接收到服務(wù)器下發(fā)的所有消息的消息標(biāo)識(shí)ID;
所述響應(yīng)消息中包括第二推送時(shí)間和新消息列表,所述新消息列表中包括本次向客戶端下發(fā)的所有新消息的消息ID和消息內(nèi)容,所述第二推送時(shí)間為所述新消息的推送時(shí)間。
33、根據(jù)32所述的系統(tǒng),所述響應(yīng)消息中包括輪詢周期時(shí),所述客戶端,還用于接收到響應(yīng)消息后,以所述輪詢周期開(kāi)始計(jì)時(shí),并在計(jì)時(shí)器超時(shí)時(shí),生成所述消息獲取請(qǐng)求并發(fā)送消息輪詢服務(wù)器。
34、根據(jù)32或33所述的系統(tǒng),所述客戶端,還用于在接收到響應(yīng)消息時(shí),若新消息列表中存在新消息,根據(jù)新消息列表中的新消息執(zhí)行相應(yīng)操作。
本說(shuō)明書(shū)中各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其它實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同或相似的部分相互參見(jiàn)即可。對(duì)于系統(tǒng)實(shí)施例而言,由于其與方法實(shí)施例基本對(duì)應(yīng),所以描述的比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。
可能以許多方式來(lái)實(shí)現(xiàn)本發(fā)明的方法和裝置。例如,可通過(guò)軟件、硬件、固件或者軟件、硬件、固件的任何組合來(lái)實(shí)現(xiàn)本發(fā)明的方法和裝置。用于所述方法的步驟的上述順序僅是為了進(jìn)行說(shuō)明,本發(fā)明的方法的步驟不限于以上具體描述的順序,除非以其它方式特別說(shuō)明。此外,在一些實(shí)施例中,還可將本發(fā)明實(shí)施為記錄在記錄介質(zhì)中的程序,這些程序包括用于實(shí)現(xiàn)根據(jù)本發(fā)明的方法的機(jī)器可讀指令。因而,本發(fā)明還覆蓋存儲(chǔ)用于執(zhí)行根據(jù)本發(fā)明的方法的程序的記錄介質(zhì)。
本發(fā)明的描述是為了示例和描述起見(jiàn)而給出的,而并不是無(wú)遺漏的或者將本發(fā)明限于所公開(kāi)的形式。很多修改和變化對(duì)于本領(lǐng)域的普通技術(shù)人員而言是顯然的。選擇和描述實(shí)施例是為了更好說(shuō)明本發(fā)明的原理和實(shí)際應(yīng)用,并且使本領(lǐng)域的普通技術(shù)人員能夠理解本發(fā)明從而設(shè)計(jì)適于特定用途的帶有各種修改的各種實(shí)施例。