,等待接收數(shù)據(jù);
[0056] 通過查詢"讀/寫"管道的狀態(tài),來完成消息中間件的讀取數(shù)據(jù)主線程與消息隊列 接收線程之間的同步;一旦消息隊列線程接收到數(shù)據(jù),讀取數(shù)據(jù)主線程可通過查詢"讀"管 道文件描述符的狀態(tài)變更,獲悉消息隊列已收到數(shù)據(jù),從而將該數(shù)據(jù)返回給應(yīng)用進程。
[0057]S5、進程發(fā)送數(shù)據(jù)接口實現(xiàn):根據(jù)發(fā)送報文頭中的發(fā)送進程ID以及預(yù)先配置的路 由表,判斷通信發(fā)生在節(jié)點間還是節(jié)點內(nèi);根據(jù)發(fā)送報文長度,判斷通信方式采用UDP還是 TCP。
[0058] 可選地,所述步驟S5包括:
[0059] 為應(yīng)用進程提供數(shù)據(jù)發(fā)送接口函數(shù),應(yīng)用進程填入需要發(fā)送的數(shù)據(jù)以及發(fā)送的目 的進程ID;消息中間件根據(jù)預(yù)設(shè)的路由表和目的進程ID,查找進程ID和目的節(jié)點的匹配關(guān) 系,以獲得消息發(fā)送的地址;
[0060] 判斷發(fā)送的報文長度是否小于大報文數(shù)據(jù)長度門限值,如小于大報文數(shù)據(jù)長度門 限值,則判斷數(shù)據(jù)發(fā)往本節(jié)點或外節(jié)點;如發(fā)往本節(jié)點,將數(shù)據(jù)發(fā)送至應(yīng)用進程所述的消息 隊列;如發(fā)往外節(jié)點采用IPD通信Socket發(fā)送數(shù)據(jù);
[0061] 如果大于或等于大報文數(shù)據(jù)長度門限值,則根據(jù)發(fā)送目的進程ID和預(yù)設(shè)的路 由表,判斷數(shù)據(jù)發(fā)送是否為點播,在數(shù)據(jù)發(fā)送為點播時,直接連接目的進程通過TCP通信 Socket發(fā)送數(shù)據(jù);在數(shù)據(jù)發(fā)送為組播時,通過TCP發(fā)送線程池發(fā)送數(shù)據(jù)。
[0062] S6、TCP組播線程池的實現(xiàn):根據(jù)預(yù)先配置的路由表,解析組播地址中包括的IP地 址,創(chuàng)建TCP發(fā)送線程池,并通過TCP發(fā)送線程池完成多地址TCP報文發(fā)送的并行處理。通 過TCP發(fā)送線程池完成多地址TCP報文發(fā)送的并行處理,可以保證數(shù)據(jù)發(fā)送的及時性。
[0063] 可選地,所述步驟S6包括:
[0064] 根據(jù)預(yù)先配置的路由表,解析組播地址中的IP地址;
[0065] 創(chuàng)建TCP發(fā)送線程池;
[0066] 將TCP通信Socket設(shè)置為非阻塞模式;
[0067] 連接發(fā)送目的地址,通過TCP發(fā)送線程池完成多地址TCP報文發(fā)送的并行處理。
[0068] 如圖3所示,本發(fā)明實施例還提供一種輕量級跨平臺消息中間件的實現(xiàn)系統(tǒng),包 括如下模塊:
[0069] 路由表配置模塊10,用于配置路由表,路由表包括進程ID、IP地址、組播地址路由 關(guān)系信息,消息中間件根據(jù)路由表解析出消息轉(zhuǎn)發(fā)控制規(guī)則;
[0070] 進程初始化模塊20,用于初始化應(yīng)用進程,創(chuàng)建該進程通信所需要的相關(guān)資源。
[0071] 可選地,如圖4所示,所述進程初始化模塊20包括如下單元:
[0072] 緩沖區(qū)初始化單元21,用于初始化進程通信所需的緩沖區(qū)及緩沖區(qū)長度;
[0073] 管道及描述符創(chuàng)建單元22,用于創(chuàng)建消息隊列的"讀/寫"管道以及相應(yīng)的文件描 述符;
[0074] 通過"讀/寫"管理標(biāo)記消息隊列接收或讀取數(shù)據(jù),將管道的文件描述符作為I/O 復(fù)用函數(shù)Select的參數(shù);Select函數(shù)允許進程指示內(nèi)核等待消息隊列、UDP通信Socket、 TCP通信Socket中任意一個接收到數(shù)據(jù),并僅在一個或多個事件發(fā)生或經(jīng)過預(yù)先指定的時 間后才喚醒進程;
[0075]UDP通信Socket創(chuàng)建單元23,用于創(chuàng)建節(jié)點間短報文通信所需的UDP通信 Socket:
[0076] 分別創(chuàng)建UDP通信接收和發(fā)送Socket,并根據(jù)進程ID為每個進程分配唯一的端口 號,將接收Socket與接收端口號綁定;
[0077]TCP通信Socket創(chuàng)建單元24,用于創(chuàng)建節(jié)點間短報文通信所需的TCP通信 Socket:
[0078] 分別創(chuàng)建TCP通信接收和發(fā)送Socket,并根據(jù)進程ID為每個進程分配唯一的端口 號,將接收Socket與接收端口號綁定;
[0079]消息隊列接收線程創(chuàng)建單元25,用于創(chuàng)建一個并發(fā)性線程,用于消息隊列接收數(shù) 據(jù)。
[0080]消息隊列接收線程模塊30,用于調(diào)用消息隊列接收函數(shù),將消息隊列接收線程阻 塞,如消息隊列收到數(shù)據(jù),將數(shù)據(jù)拷貝至進程專屬緩沖區(qū)中,并改寫消息隊列"讀"與"寫"管 道狀態(tài);
[0081] 進程讀取數(shù)據(jù)接口模塊40,用于利用P0SIX庫的1/0復(fù)用Select函數(shù),輪詢消息 隊列"寫"管道、UDP通信Socket和TCP通信Socket,如收到數(shù)據(jù)則將數(shù)據(jù)拷貝至進程專屬 緩沖區(qū)中,并改寫消息隊列"讀"與"寫"管道狀態(tài)。
[0082] 可選地,所述進程讀取數(shù)據(jù)接口模塊40包括:
[0083] 分配一個描述字集,并將描述字集初始化;
[0084] 將"讀"管道文件描述符、UDP通信Socket句柄、TCP通信Socket句柄加入到描述 字集;使用Select函數(shù)輪詢描述字集,等待接收數(shù)據(jù);
[0085] 通過查詢"讀/寫"管道的狀態(tài),來完成消息中間件的讀取數(shù)據(jù)主線程與消息隊列 接收線程之間的同步;一旦消息隊列線程接收到數(shù)據(jù),讀取數(shù)據(jù)主線程可通過查詢"讀"管 道文件描述符的狀態(tài)變更,獲悉消息隊列已收到數(shù)據(jù),從而將該數(shù)據(jù)返回給應(yīng)用進程。
[0086] 進程發(fā)送數(shù)據(jù)接口模塊50,用于根據(jù)發(fā)送報文頭中的發(fā)送進程ID以及預(yù)先配置 的路由表,判斷通信發(fā)生在節(jié)點間還是節(jié)點內(nèi);根據(jù)發(fā)送報文長度,判斷通信方式采用UDP 還是TCP。
[0087] 可選地,所述進程發(fā)送數(shù)據(jù)接口模塊50包括:
[0088] 為應(yīng)用進程提供數(shù)據(jù)發(fā)送接口函數(shù),應(yīng)用進程填入需要發(fā)送的數(shù)據(jù)以及發(fā)送的目 的進程ID;消息中間件根據(jù)預(yù)設(shè)的路由表和目的進程ID,查找進程ID和目的節(jié)點的匹配關(guān) 系,以獲得消息發(fā)送的地址;
[0089] 判斷發(fā)送的報文長度是否小于大報文數(shù)據(jù)長度門限值,如小于大報文數(shù)據(jù)長度門 限值,則判斷數(shù)據(jù)發(fā)往本節(jié)點或外節(jié)點;如發(fā)往本節(jié)點,將數(shù)據(jù)發(fā)送至應(yīng)用進程所述的消息 隊列;如發(fā)往外節(jié)點采用IPD通信Socket發(fā)送數(shù)據(jù);
[0090] 如果大于或等于大報文數(shù)據(jù)長度門限值,則根據(jù)發(fā)送目的進程ID和預(yù)設(shè)的路 由表,判斷數(shù)據(jù)發(fā)送是否為點播,在數(shù)據(jù)發(fā)送為點播時,直接連接目的進程通過TCP通信 Socket發(fā)送數(shù)據(jù);在數(shù)據(jù)發(fā)送為組播時,通過TCP發(fā)送線程池發(fā)送數(shù)據(jù)。
[0091] TCP組播線程池模塊60,用于根據(jù)預(yù)先配置的路由表,解析組播地址中包括的IP 地址,創(chuàng)建TCP發(fā)送線程池,并通過TCP發(fā)送線程池完成多地址TCP報文發(fā)送的并行處理。
[0092] 可選地,所述TCP組播線程池模塊60包括:
[0093] 根據(jù)預(yù)先配置的路由表,解析組播地址中的IP地址;
[0094] 創(chuàng)建TCP發(fā)送線程池;
[0095] 將TCP通信Socket設(shè)置為非阻塞模式;
[0096] 連接發(fā)送目的地址,通過TCP發(fā)送線程池完成多地址TCP報文發(fā)送的并行處理。
[0097] 結(jié)合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí) 行的軟件模塊,或者二者的結(jié)合來實施。軟件模塊可以置于隨機儲存器、內(nèi)存、只讀存儲器、 電可編程R0M、電可擦除可編程R0M、寄存器、硬盤、可移動磁盤、⑶-R0M、或技術(shù)領(lǐng)域內(nèi)所公 知的任意其他形式的存儲介質(zhì)中。
[0098] 可以理解的是,對于本領(lǐng)域的普通技術(shù)人員來說,可以根據(jù)本發(fā)明的技術(shù)構(gòu)思做 出其它各種相應(yīng)的改變與變形,而所有這些改變與變形都應(yīng)屬于本發(fā)明權(quán)利要求的保護范 圍。
【主權(quán)項】
1. 一種輕量級跨平臺消息中間件的實現(xiàn)方法,其特征在于,包括如下步驟: 51、 配置路由表,路由表包括進程ID、IP地址、組播地址路由關(guān)系信息,消息中間件根 據(jù)路由表解析出消息轉(zhuǎn)發(fā)控制規(guī)則; 52、 初始化應(yīng)用進程,創(chuàng)建該進程通信所需要的相關(guān)資源; 53、 消息隊列接收線程實現(xiàn):調(diào)用消息隊列接收函數(shù),將消息隊列接收線程阻塞,如消 息隊列收到數(shù)據(jù),將數(shù)據(jù)拷貝至進程專屬緩沖區(qū)中,并改寫消息隊列"讀"與"寫"管道狀 態(tài); 54、 進程讀取數(shù)據(jù)接口實現(xiàn):利用POSIX庫的I/O復(fù)用Select函數(shù),輪詢消息隊列"寫" 管道、UDP通信Socket和TCP通信Socket,如收到數(shù)據(jù)則將數(shù)據(jù)拷貝至進程專屬緩沖區(qū)中, 并改寫消息隊列"讀"與"寫"管道狀態(tài); 55、 進程發(fā)送數(shù)據(jù)接口實現(xiàn):根據(jù)發(fā)送報文頭