2010-07-19 92 views
1

我有一個處理各種不同命令的遠程服務器,其中一個是事件提取方法。XMLRPCPP異步處理多個調用?

如果隊列中列出的一個或多個事件準備好處理,則事件獲取會立即返回。如果事件隊列爲空,則此方法在數秒後纔會返回。這樣我就不會遇到任何HTTP /套接字超時。一旦事件可用,該方法立即返回。這樣客戶端纔會連接到服務器,並且服務器不必與客戶端建立任何連接。這個事件機制很好地工作。我正在使用增強庫來處理隊列,事件通知等。

這是問題所在。當服務器阻止從事件獲取方法返回時,在此期間,我不能發出任何其他命令。 在源代碼XmlRpcDispatch.cpp中,我在「工作」方法中看到了一個使用阻塞調用來「選擇」的簡單循環。 似乎在處理方法繁忙時,不會處理其他任何請求。

問題:我沒有看到什麼,XmlRpcpp(xmlrpC++)可以異步處理多個請求嗎?有誰知道C++更好的xmlrpc庫嗎?我不假設Boost庫有一個讓我發出遠程命令的組件? 我其實不在乎XML或over-HTTP功能。我只需要通過TCP以任何形狀或形式發佈(異步)命令? 我期待任何人可能提供的任何輸入。

回答

1

我遇到了一些問題XMLRPC還,並研究了像gSOAP的和XMLRPC++許多解決方案,但最終我放棄了,使用Boost.ASIOTinyXML++寫整個HTTP + XML-RPC從頭開始(後來我swaped TinyXML使用expat)。這不是那麼多工作;我在大約一個星期內自己做了,從頭開始,並結束了許多完全實施的RPC調用。

Boost.ASIO給出了很好的結果。就像它的名字所說的那樣,它完全是異步的,而且性能優良,開銷很小,對我來說這很重要,因爲它在嵌入式環境(MIPS)中運行。

後來,這可能是你的情況,我將XML更改爲Google's Protocol-buffers,甚至更快樂。它的API以及它的消息容器都是類型安全的(即,你發送一個int和一個float,並且它永遠不會被轉換爲字符串並返回,就像XML的情況一樣),一旦你掌握了它,這不需要很長時間,這是非常高效的解決方案。

我recomendation:如果你能夠擺脫XML,去Boost.ASIO + Protobuf
如果您需要XML:Boost.ASIO + Expat

從頭開始做這個東西是真的值得它。

+0

我在考慮使用boost的asio。我希望我可以將整數和字符串寫入C++端的流中,並使用DataInputStream讀取在Java端接收它。 – Mike 2010-07-22 19:46:28

+0

@Mike然後我強烈建議使用XML或protobuf;因爲這樣做可能會有一些小問題,他們都會爲你處理這個問題。 – Gianni 2010-07-22 21:53:52

+0

@Gianni。遇到asio的問題。我有一個事件隊列,當它爲空時,並且在使用套接字通信進行查詢時,會在返回之前等待一段時間,並報告隊列爲空,或者在隊列變爲可用時喚醒並報告隊列的內容。 所以客戶端有兩個連接到服務器。一個發佈指令,另一個獲取(等待)事件。 問題是,當使用asio時,當一個會話正在等待時,另一個不接受任何命令。所以換句話說,一個會話是另一個會話。 非常不同步? – Mike 2010-07-26 17:38:00