專利名稱:一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)處理技術(shù)領(lǐng)域,尤其涉及一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法及系統(tǒng)。
背景技術(shù):
在數(shù)據(jù)集成場景中,需要從一個(gè)集成節(jié)點(diǎn)去處理另一節(jié)點(diǎn)上的η個(gè)隊(duì)列節(jié)點(diǎn)Q1、 Q2、…、Qn,如圖1所示,這η個(gè)隊(duì)列為Java消息服務(wù)(Java Message Service, JMS)隊(duì)列,每個(gè)隊(duì)列節(jié)點(diǎn)中可能存在若干消息,也可能為空,負(fù)責(zé)接收消息的端點(diǎn)需要遍歷每一個(gè)隊(duì)列節(jié)點(diǎn),等待一段時(shí)間后,再做接收消息操作處理,對目標(biāo)隊(duì)列節(jié)點(diǎn)做接收消息處理時(shí), 每次只能接收一條消息。其接收消息的過程為整體上順序循環(huán)遍歷各個(gè)隊(duì)列節(jié)點(diǎn),對每個(gè)隊(duì)列節(jié)點(diǎn)等待一段較長的時(shí)間τ (例如5秒),然后再去做接收消息處理。如果接收到消息,則等待一段較短的時(shí)間t (例如0. 05秒)去繼續(xù)接收消息,直到接收處理的次數(shù)達(dá)到一個(gè)額定值S (例如 1000次),或者在t時(shí)間內(nèi)未接收到消息,則轉(zhuǎn)至下個(gè)隊(duì)列節(jié)點(diǎn)繼續(xù)進(jìn)行接收消息處理。當(dāng)隊(duì)列節(jié)點(diǎn)的數(shù)目較少時(shí),接收消息的過程不會(huì)出現(xiàn)明顯問題,但是隨著業(yè)務(wù)的發(fā)展,所需集成的業(yè)務(wù)數(shù)據(jù)類型增多,隊(duì)列節(jié)點(diǎn)η的數(shù)目增加,可達(dá)20左右,不妨假設(shè)η = 20時(shí),而隊(duì)列節(jié)點(diǎn)中只有Q19中有消息,則在接收消息時(shí)就必須先遍歷Ql Q18共18個(gè)隊(duì)列節(jié)點(diǎn),花費(fèi)ISXk = 90s時(shí)間,才能開始處理Q19中的消息,消息處理速度慢,效率低。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例的目的在于提供一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法,旨在解決現(xiàn)有技術(shù)中隨著集成的業(yè)務(wù)數(shù)據(jù)類型的增多,隊(duì)列節(jié)點(diǎn)η的數(shù)目增加,導(dǎo)致消息處理速度慢,效率低的問題。本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法,所述方法包括下述步驟創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。本發(fā)明實(shí)施例的另一目的在于提供一種從多隊(duì)列節(jié)點(diǎn)獲取消息的系統(tǒng),所述系統(tǒng)包括創(chuàng)建模塊,用于創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);
第一隊(duì)列處理模塊,用于當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;以及第二隊(duì)列處理模塊,用于當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。在本發(fā)明實(shí)施例中,創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理,減少對隊(duì)列節(jié)點(diǎn)的消息處理時(shí)的等待時(shí)間,提高了傳輸效率。
圖1是現(xiàn)有技術(shù)提供的節(jié)點(diǎn)遍歷示意圖;圖2是本發(fā)明實(shí)施例提供的從多隊(duì)列節(jié)點(diǎn)獲取消息的方法的實(shí)現(xiàn)流程圖;圖3是本發(fā)明實(shí)施例提供的創(chuàng)建兩個(gè)同步隊(duì)列的實(shí)現(xiàn)流程圖;圖4是本發(fā)明實(shí)施例提供的當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列的步驟的實(shí)現(xiàn)流程圖;圖5是本發(fā)明實(shí)施例提供的當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理的步驟的實(shí)現(xiàn)流程圖;圖6是本發(fā)明實(shí)施例提供的從多隊(duì)列節(jié)點(diǎn)中獲取消息的系統(tǒng)的結(jié)構(gòu)框圖;圖7是本發(fā)明實(shí)施例提供的創(chuàng)建模塊的結(jié)構(gòu)框圖;圖8是本發(fā)明實(shí)施例提供的第一隊(duì)列處理模塊的結(jié)構(gòu)框圖;圖9是本發(fā)明實(shí)施例提供的第二隊(duì)列處理模塊的結(jié)構(gòu)框圖;圖10是本發(fā)明實(shí)施例提供的節(jié)點(diǎn)遍歷示意圖。
具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。在本發(fā)明實(shí)施例中,采用兩個(gè)同步隊(duì)列對原始隊(duì)列的隊(duì)列節(jié)點(diǎn)進(jìn)行分配調(diào)度,減少處理接收消息時(shí)的等待時(shí)間,提高效率。本發(fā)明實(shí)施例的目的在于提供一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法,所述方法包括下述步驟創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。本發(fā)明實(shí)施例的另一目的在于提供一種從多隊(duì)列節(jié)點(diǎn)獲取消息的系統(tǒng),所述系統(tǒng)包括創(chuàng)建模塊,用于創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)占.
^ \\\ 第一隊(duì)列處理模塊,用于當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;以及第二隊(duì)列處理模塊,用于當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。在本發(fā)明實(shí)施例中,創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。實(shí)施例一圖2示出了本發(fā)明第一實(shí)施例提供的從多隊(duì)列節(jié)點(diǎn)獲取消息的方法的實(shí)現(xiàn)流程, 其具體的步驟如下所述在步驟SlOl中,創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)
點(diǎn)ο在本發(fā)明實(shí)施例中,該創(chuàng)建兩個(gè)同步隊(duì)列的過程為預(yù)處理過程,其主要是將原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)分為兩部分進(jìn)行處理,提高處理的效率。在步驟S102中,當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列。在本發(fā)明實(shí)施例中,由于在預(yù)處理過程中,創(chuàng)建兩個(gè)同步隊(duì)列時(shí),被分配到第一隊(duì)列的隊(duì)列節(jié)點(diǎn)為沒有包含消息的隊(duì)列節(jié)點(diǎn),被分配到第二隊(duì)列的隊(duì)列節(jié)點(diǎn)是包含有消息的隊(duì)列節(jié)點(diǎn),由于數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性,被分配到第一隊(duì)列的隊(duì)列節(jié)點(diǎn)在下一時(shí)刻可能會(huì)包含消息,而被分配到第二隊(duì)列的隊(duì)列節(jié)點(diǎn)在下一時(shí)刻可能不會(huì)包含消息,上述預(yù)先創(chuàng)建的第一隊(duì)列和第二隊(duì)列為后續(xù)的節(jié)點(diǎn)處理帶來便利。在步驟S103中,當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。在本發(fā)明實(shí)施例中,對于包含有消息的隊(duì)列節(jié)點(diǎn)的處理方式與現(xiàn)有的方式類似, 下述有具體的實(shí)施例進(jìn)行描述,在此不再贅述。在本發(fā)明實(shí)施例中,將原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)是否包含消息作為分類依據(jù),將原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)存放到預(yù)先創(chuàng)建兩個(gè)同步隊(duì)列中,其中,第一隊(duì)列存放沒有消息的隊(duì)列節(jié)點(diǎn),第二隊(duì)列存放有消息的隊(duì)列節(jié)點(diǎn),然后,采用兩個(gè)處理進(jìn)程分別對這兩個(gè)的同步隊(duì)列進(jìn)行消息處理,由于減少了隊(duì)列節(jié)點(diǎn)的無用的等待遍歷的時(shí)間,提高了傳輸效率,同時(shí)采用更加靈活的節(jié)點(diǎn)處理方式,提高軟件的靈活性。實(shí)施例二圖3示出了本發(fā)明實(shí)施例提供的創(chuàng)建兩個(gè)同步隊(duì)列的實(shí)現(xiàn)流程,其具體的步驟如下所述在步驟S201中,創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列。在本發(fā)明實(shí)施例中,創(chuàng)建兩個(gè)空的同步隊(duì)列,該同步隊(duì)列用于存放隊(duì)列節(jié)點(diǎn),其存放的依據(jù)是隊(duì)列節(jié)點(diǎn)是否包含有消息。在步驟S202中,對原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)進(jìn)行檢測,檢測所述隊(duì)列節(jié)點(diǎn)是否有消息存在,是則執(zhí)行步驟S203,否則執(zhí)行步驟S204。在步驟S203中,當(dāng)檢測到所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述對列節(jié)點(diǎn)放入所述第二隊(duì)列。在步驟S204中,當(dāng)檢測到所述隊(duì)列節(jié)點(diǎn)沒有包含消息時(shí),將所述對列節(jié)點(diǎn)放入所述第一隊(duì)列。在本發(fā)明實(shí)施例中,將原始隊(duì)列中的節(jié)點(diǎn)分兩個(gè)隊(duì)列進(jìn)行存放,其應(yīng)用于多業(yè)務(wù)類型的集成場景中,即為了解決等待時(shí)間過長的問題,而采用本實(shí)施例提供的創(chuàng)建兩個(gè)同步隊(duì)列的方式,該過程為預(yù)處理過程,第一隊(duì)列和第二隊(duì)列存放的隊(duì)列節(jié)點(diǎn)是暫時(shí)的,隨著時(shí)間實(shí)時(shí)變化的。該實(shí)施例為執(zhí)行本發(fā)明方案的一個(gè)預(yù)備工作,其基本是創(chuàng)建兩個(gè)同步隊(duì)列的過程。實(shí)施例三圖4示出了本發(fā)明實(shí)施例提供的當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列的步驟的實(shí)現(xiàn)流程,其具體的步驟如下所述在步驟S301中,當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)。在本發(fā)明實(shí)施例中,該循環(huán)取出第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)按照先進(jìn)先出的原則。在步驟S302中,檢測取出的所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)是否包含有消息,是則執(zhí)行步驟S303,否則執(zhí)行步驟S304。在步驟S303中,當(dāng)所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列。在步驟S304中,當(dāng)所述隊(duì)列節(jié)點(diǎn)不包含消息時(shí),繼續(xù)將所述隊(duì)列節(jié)點(diǎn)放入所述第一隊(duì)列。
該實(shí)施例是對第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)進(jìn)行處理的實(shí)現(xiàn)過程,將第一隊(duì)列中包含消息的隊(duì)列節(jié)點(diǎn)放入第二隊(duì)列,將第一隊(duì)列中沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入第一隊(duì)列。實(shí)施例四圖5示出了本發(fā)明實(shí)施例提供的當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理的步驟的實(shí)現(xiàn)流程,其具體的步驟如下所述在步驟S401中,當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn)。在本發(fā)明實(shí)施例中,該循環(huán)取出第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)按照先進(jìn)先出的原則。在步驟S402中,對每個(gè)隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,監(jiān)聽時(shí)間為第一時(shí)間。在本發(fā)明實(shí)施例中,對每個(gè)取出的隊(duì)列節(jié)點(diǎn),首先等待一個(gè)較長時(shí)間,然后再去進(jìn)行消息的接收操作,該較長時(shí)間為監(jiān)聽時(shí)間,即為第一時(shí)間,假設(shè)為T。在步驟S403中,對監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)進(jìn)行消息的接收操作處理。在步驟S404中,判斷是否接收到消息,是則執(zhí)行步驟S405,否則執(zhí)行步驟S408。在步驟S405中,當(dāng)從所述隊(duì)列節(jié)點(diǎn)接收到消息時(shí),繼續(xù)對所述隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,所述監(jiān)聽時(shí)間為第二時(shí)間。在本發(fā)明實(shí)施例中,當(dāng)從隊(duì)列節(jié)點(diǎn)接收到消息時(shí),繼續(xù)進(jìn)行監(jiān)聽操作,該監(jiān)聽時(shí)間為第二時(shí)間,不妨設(shè)為t。在步驟S406中,對監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)繼續(xù)進(jìn)行消息的接收操作處理。在步驟S407中,判斷是否接收到消息,是則執(zhí)行步驟S409,否則執(zhí)行步驟S408。在步驟S408中,當(dāng)在第一時(shí)間內(nèi)沒有接收到消息,或在第二時(shí)間內(nèi)沒有接收到消息,則將所述隊(duì)列節(jié)點(diǎn)放入第一隊(duì)列。在本發(fā)明實(shí)施例中,上述步驟是一個(gè)循環(huán)的過程,直至消息接收完成。在步驟S409中,判斷對所述隊(duì)列節(jié)點(diǎn)的接收消息的次數(shù)是否超過預(yù)設(shè)閾值,是則執(zhí)行步驟S410,否則執(zhí)行步驟S405。在本發(fā)明實(shí)施例中,該接收消息的次數(shù)可設(shè)置為1000次。在步驟S410中,當(dāng)對所述隊(duì)列節(jié)點(diǎn)的接收消息的次數(shù)超過預(yù)設(shè)閾值時(shí),將所述隊(duì)列節(jié)點(diǎn)放入第二隊(duì)列。上述僅為本發(fā)明的一個(gè)實(shí)施例,其具體是對于第二隊(duì)列的隊(duì)列節(jié)點(diǎn)的處理流程。本發(fā)明實(shí)施例提供的方案解決了多業(yè)務(wù)類型集成場景中,減少無用的等待時(shí)間, 提高傳輸效率。實(shí)施例五圖6示出了本發(fā)明實(shí)施例提供的從多隊(duì)列節(jié)點(diǎn)中獲取消息的系統(tǒng)的結(jié)構(gòu)框圖,為了便于說明,圖中僅給出了與本發(fā)明實(shí)施例相關(guān)的部分。創(chuàng)建模塊11創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn); 第一隊(duì)列處理模塊12當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;第二隊(duì)列處理模塊13當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。上述僅為本發(fā)明的一個(gè)系統(tǒng)實(shí)施例,其各模塊的功能如上述方法實(shí)施例所述。實(shí)施例六作為本發(fā)明的一個(gè)實(shí)施例,圖7示出了本發(fā)明實(shí)施例提供的創(chuàng)建模塊的結(jié)構(gòu)框圖,為了便于說明,圖中僅給出了與本發(fā)明實(shí)施例相關(guān)的部分。同步隊(duì)列創(chuàng)建模塊111創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列;第一檢測模塊112對原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)進(jìn)行檢測,檢測所述隊(duì)列節(jié)點(diǎn)是否有消息存在;第一放入模塊113當(dāng)所述第一檢測模塊112檢測到所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述對列節(jié)點(diǎn)放入所述第二隊(duì)列;第二放入模塊114當(dāng)所述第一檢測模塊112檢測到所述隊(duì)列節(jié)點(diǎn)沒有包含消息時(shí),將所述對列節(jié)點(diǎn)放入所述第一隊(duì)列。上述僅為本發(fā)明的一個(gè)系統(tǒng)實(shí)施例,其各模塊的功能如上述方法實(shí)施例所述。實(shí)施例七作為本發(fā)明的一個(gè)實(shí)施例,圖8示出了本發(fā)明實(shí)施例提供的第一隊(duì)列處理模塊的結(jié)構(gòu)框圖,為了便于說明,圖中僅給出了與本發(fā)明實(shí)施例相關(guān)的部分。第一隊(duì)列節(jié)點(diǎn)取出模塊121當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn);第二檢測模塊122檢測取出的所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)是否包含有消息;當(dāng)所述第二檢測模塊122檢測所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),第三放入模塊123將所述隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列;當(dāng)所述第二檢測模塊122檢測所述隊(duì)列節(jié)點(diǎn)不包含消息時(shí),第四放入模塊IM繼續(xù)將所述隊(duì)列節(jié)點(diǎn)放入所述第一隊(duì)列。上述僅為本發(fā)明的一個(gè)系統(tǒng)實(shí)施例,其各模塊的功能描述如上述方法實(shí)施例所述。實(shí)施例八作為本發(fā)明的一個(gè)具體實(shí)施例,圖9示出了本發(fā)明實(shí)施例提供的第二隊(duì)列處理模塊的結(jié)構(gòu)框圖,為了便于說明,圖中僅給出了與本發(fā)明實(shí)施例相關(guān)的部分。第二隊(duì)列節(jié)點(diǎn)取出模塊131當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn);第一監(jiān)聽操作模塊132對每個(gè)隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,監(jiān)聽時(shí)間為第一時(shí)間;第一消息接收模塊133對所述第一監(jiān)聽操作模塊132監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)進(jìn)行消息的接收操作處理;當(dāng)所述第一消息接收模塊133從隊(duì)列節(jié)點(diǎn)接收到消息時(shí),第二監(jiān)聽操作模塊134繼續(xù)對所述隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,所述監(jiān)聽時(shí)間為第二時(shí)間;第二消息接收模塊135對所述第二監(jiān)聽操作模塊134監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)繼續(xù)進(jìn)行消息的接收操作處理,直至消息接收完成;第五放入模塊136當(dāng)在第一時(shí)間內(nèi)沒有接收到消息,或在第二時(shí)間內(nèi)沒有接收到消息,則將所述隊(duì)列節(jié)點(diǎn)放入第一隊(duì)列;第六放入模塊137當(dāng)對所述隊(duì)列節(jié)點(diǎn)的接收消息的次數(shù)超過預(yù)設(shè)閾值時(shí),將所述隊(duì)列節(jié)點(diǎn)放入第二隊(duì)列。上述僅為本發(fā)明的一個(gè)系統(tǒng)實(shí)施例,其各模塊的功能描述如上述方法實(shí)施例所述。實(shí)施例九作為本發(fā)明的一個(gè)具體實(shí)施例,以圖1所示的示意圖為例,假設(shè)Ql、Q2. . . Qn均為集成服務(wù)器上的消息通道,其中分別負(fù)責(zé)轉(zhuǎn)發(fā)工廠1、工廠2...工廠η的數(shù)據(jù)。端點(diǎn)則是一個(gè)接收端,它訂閱了此η個(gè)消息通道。它需要去處理這η的消息通道中的消息?,F(xiàn)在假設(shè)Ql每1個(gè)小時(shí)會(huì)有一條消息需要處理。Q2每分鐘有1000條消息需要處理。Q3每分鐘有10條消息需要處理。Q4每秒鐘有100條消息需要處理。Q5每天有1000條消息需要處理。其他消息通道都沒有消息。因?yàn)楦鱾€(gè)消息通道的消息頻率和概率是離散分布的。所以如果采用常規(guī)方式,很難保證處理不會(huì)因?yàn)榭障⑼ǖ篮拖⒚芏却蟮耐ǖ勒加眠^多處理時(shí)間,從而令其他通道得不到及時(shí)處理。而采用本發(fā)明實(shí)施例提供的技術(shù)方案后,可以將該隊(duì)列中的隊(duì)列節(jié)點(diǎn)分為兩類, 包含消息的和不包含消息的,同時(shí)將該分類的隊(duì)列節(jié)點(diǎn)分別放入預(yù)先創(chuàng)建的同步隊(duì)列,分別采用不同的策略對同步隊(duì)列中的節(jié)點(diǎn)進(jìn)行消息處理,提高了數(shù)據(jù)的傳輸效率,下述給出一個(gè)具體的實(shí)施過程參閱圖10假設(shè)目前Ql Q5中消息數(shù)量1.創(chuàng)建兩個(gè)同步的先進(jìn)先出(FIFO)隊(duì)列,分別是第一隊(duì)列和第二隊(duì)列;2.遍歷Ql Q5,將有消息的Q1、Q4、Q5放入第二隊(duì)列,沒有消息的Q2、Q3放入第一隊(duì)列;3.監(jiān)聽Ql —段時(shí)間tl,接收消息;4.監(jiān)聽Ql —段時(shí)間t2,沒有收到消息,將Ql放入第一隊(duì)列,轉(zhuǎn)向處理Q4 ;5.監(jiān)聽Q4 —段時(shí)間tl,接收消息;6.監(jiān)聽Q4—段時(shí)間t2,接收消息,直到?jīng)]有消息為止,將Q4放入第一隊(duì)列,轉(zhuǎn)向處理Q5 ;7.監(jiān)聽Q5 —段時(shí)間tl,接收消息;8.監(jiān)聽Q5 —段時(shí)間t2,接收消息,直到?jīng)]有消息為止,將Q5放入第一隊(duì)列;9.返回步驟2,重新處理。上述僅為本發(fā)明的一個(gè)具體實(shí)施例,在此不用以限制本發(fā)明。在本發(fā)明實(shí)施例中,創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理,減少對隊(duì)列節(jié)點(diǎn)的消息處理時(shí)的等待時(shí)間,提高了傳輸效率。采用本發(fā)明所述的策略可以有效地將需要處理和無需處理的隊(duì)列節(jié)點(diǎn)分別對待處理,而且可以通過進(jìn)一步的設(shè)置檢測次數(shù)閾值,避免在某一個(gè)節(jié)點(diǎn)上消耗過多時(shí)間,在大規(guī)模多隊(duì)列節(jié)點(diǎn)的集成場景中,采用本發(fā)明的策略,可以有效避免過多的等待時(shí)間,體現(xiàn)出負(fù)載均衡的特點(diǎn),提高集成的效率。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法,其特征在于,所述方法包括下述步驟創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。
2.如權(quán)利要求1所述的方法,其特征在于,所述創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列的具體步驟具體包括創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列; 對原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)進(jìn)行檢測,檢測所述隊(duì)列節(jié)點(diǎn)是否有消息存在; 當(dāng)檢測到所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述對列節(jié)點(diǎn)放入所述第二隊(duì)列; 當(dāng)檢測到所述隊(duì)列節(jié)點(diǎn)沒有包含消息時(shí),將所述對列節(jié)點(diǎn)放入所述第一隊(duì)列。
3.如權(quán)利要求1所述的方法,其特征在于,所述當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí), 循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列的步驟具體包括下述步驟當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn); 檢測取出的所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)是否包含有消息; 當(dāng)所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列; 當(dāng)所述隊(duì)列節(jié)點(diǎn)不包含消息時(shí),繼續(xù)將所述隊(duì)列節(jié)點(diǎn)放入所述第一隊(duì)列。
4.如權(quán)利要求1所述的方法,其特征在于,所述當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí), 循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理的步驟具體包含下述步驟當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn); 對每個(gè)隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,監(jiān)聽時(shí)間為第一時(shí)間; 對監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)進(jìn)行消息的接收操作處理;當(dāng)從所述隊(duì)列節(jié)點(diǎn)接收到消息時(shí),繼續(xù)對所述隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,所述監(jiān)聽時(shí)間為第二時(shí)間;對監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)繼續(xù)進(jìn)行消息的接收操作處理,直至消息接收完成; 當(dāng)在第一時(shí)間內(nèi)沒有接收到消息,或在第二時(shí)間內(nèi)沒有接收到消息,則將所述隊(duì)列節(jié)點(diǎn)放入第一隊(duì)列;當(dāng)對所述隊(duì)列節(jié)點(diǎn)的接收消息的次數(shù)超過預(yù)設(shè)閾值時(shí),將所述隊(duì)列節(jié)點(diǎn)放入第二隊(duì)列。
5.一種從多隊(duì)列節(jié)點(diǎn)獲取消息的系統(tǒng),其特征在于,所述系統(tǒng)包括創(chuàng)建模塊,用于創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);第一隊(duì)列處理模塊,用于當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;以及第二隊(duì)列處理模塊,用于當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理。
6.如權(quán)利要求5所述的系統(tǒng),其特征在于,所述創(chuàng)建模塊具體包括 同步隊(duì)列創(chuàng)建模塊,用于創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列;第一檢測模塊,用于對原始隊(duì)列中的隊(duì)列節(jié)點(diǎn)進(jìn)行檢測,檢測所述隊(duì)列節(jié)點(diǎn)是否有消息存在;第一放入模塊,用于當(dāng)所述第一檢測模塊檢測到所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述對列節(jié)點(diǎn)放入所述第二隊(duì)列;以及第二放入模塊,用于當(dāng)所述第一檢測模塊檢測到所述隊(duì)列節(jié)點(diǎn)沒有包含消息時(shí),將所述對列節(jié)點(diǎn)放入所述第一隊(duì)列。
7.如權(quán)利要求5所述的系統(tǒng),其特征在于,所述第一隊(duì)列處理模塊具體包括第一隊(duì)列節(jié)點(diǎn)取出模塊,用于當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn);第二檢測模塊,用于檢測取出的所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn)是否包含有消息; 第三放入模塊,用于當(dāng)所述第二檢測模塊檢測所述隊(duì)列節(jié)點(diǎn)包含有消息時(shí),將所述隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列;以及第四放入模塊,用于當(dāng)所述第二檢測模塊檢測所述隊(duì)列節(jié)點(diǎn)不包含消息時(shí),繼續(xù)將所述隊(duì)列節(jié)點(diǎn)放入所述第一隊(duì)列。
8.如權(quán)利要求5所述的系統(tǒng),其特征在于,所述第二隊(duì)列處理模塊具體包括第二隊(duì)列節(jié)點(diǎn)取出模塊,用于當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn);第一監(jiān)聽操作模塊,用于對每個(gè)隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,監(jiān)聽時(shí)間為第一時(shí)間; 第一消息接收模塊,用于對所述第一監(jiān)聽操作模塊監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)進(jìn)行消息的接收操作處理;第二監(jiān)聽操作模塊,用于當(dāng)所述第一消息接收模塊從隊(duì)列節(jié)點(diǎn)接收到消息時(shí),繼續(xù)對所述隊(duì)列節(jié)點(diǎn)執(zhí)行監(jiān)聽操作,所述監(jiān)聽時(shí)間為第二時(shí)間;第二消息接收模塊,用于對所述第二監(jiān)聽操作模塊監(jiān)聽操作后的隊(duì)列節(jié)點(diǎn)繼續(xù)進(jìn)行消息的接收操作處理,直至消息接收完成;第五放入模塊,用于當(dāng)在第一時(shí)間內(nèi)沒有接收到消息,或在第二時(shí)間內(nèi)沒有接收到消息,則將所述隊(duì)列節(jié)點(diǎn)放入第一隊(duì)列;以及第六放入模塊,用于當(dāng)對所述隊(duì)列節(jié)點(diǎn)的接收消息的次數(shù)超過預(yù)設(shè)閾值時(shí),將所述隊(duì)列節(jié)點(diǎn)放入第二隊(duì)列。
全文摘要
本發(fā)明適用于數(shù)據(jù)處理技術(shù)領(lǐng)域,提供了一種從多隊(duì)列節(jié)點(diǎn)獲取消息的方法及系統(tǒng),所述方法包括下述步驟創(chuàng)建兩個(gè)同步隊(duì)列,分別記為第一隊(duì)列和第二隊(duì)列,其中,所述第一隊(duì)列用于存放沒有消息存在的隊(duì)列節(jié)點(diǎn),所述第二隊(duì)列用于存放有消息存在的隊(duì)列節(jié)點(diǎn);當(dāng)所述第一隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第一隊(duì)列中的隊(duì)列節(jié)點(diǎn),將包含有消息的隊(duì)列節(jié)點(diǎn)放入所述第二隊(duì)列,將沒有包含消息的隊(duì)列節(jié)點(diǎn)繼續(xù)放入所述第一隊(duì)列;當(dāng)所述第二隊(duì)列中有隊(duì)列節(jié)點(diǎn)元素時(shí),循環(huán)取出所述第二隊(duì)列中的隊(duì)列節(jié)點(diǎn),對包含有消息的隊(duì)列節(jié)點(diǎn)進(jìn)行消息接收操作處理,減少對隊(duì)列節(jié)點(diǎn)的消息處理時(shí)的等待時(shí)間,提高了傳輸效率。
文檔編號G06F9/48GK102479106SQ20101055528
公開日2012年5月30日 申請日期2010年11月23日 優(yōu)先權(quán)日2010年11月23日
發(fā)明者崔燦 申請人:金蝶軟件(中國)有限公司