XMLRPCPP асинхронно обрабатывает несколько вызовов? - PullRequest
1 голос
/ 20 июля 2010

У меня есть удаленный сервер, который обрабатывает различные команды, одна из которых - метод извлечения событий.

Выборка событий сразу возвращается, если в очереди есть 1 или более событий, готовых к обработке. Если очередь событий пуста, этот метод не возвращается до истечения нескольких секунд. Таким образом, я не сталкиваюсь с тайм-аутами HTTP / сокетов. В тот момент, когда событие становится доступным, метод сразу возвращается. Таким образом, клиент только устанавливает соединения с сервером, и серверу не нужно устанавливать какие-либо соединения с клиентом. Этот механизм событий работает хорошо. Я использую библиотеку надстройки для обработки очередей, уведомлений о событиях и т. Д.

Вот проблема. Пока сервер задерживает возврат из метода извлечения событий, в течение этого времени я не могу выдавать какие-либо другие команды. В исходном коде, XmlRpcDispatch.cpp, я вижу в методе «работа» простой цикл, который использует блокирующий вызов для «выбора». Похоже, пока обработка метода занята, другие запросы не обрабатываются.

Вопрос: я что-то не вижу и может ли XmlRpcpp (xmlrpc ++) обрабатывать несколько запросов асинхронно? Кто-нибудь знает лучшую библиотеку xmlrpc для C ++? Я не думаю, что библиотека Boost имеет компонент, который позволяет мне выполнять удаленные команды? На самом деле меня не волнует функция XML или over-HTTP. Мне просто нужно выдавать (асинхронные) команды через TCP в любой форме или форме? Я с нетерпением жду любой информации, которую кто-либо может предложить.

1 Ответ

1 голос
/ 20 июля 2010

У меня также были некоторые проблемы с XMLRPC, и я исследовал многие решения, такие как GSoap и XMLRPC ++, но в итоге я сдался и написал весь HTTP + XMLRPC с нуля, используя Boost.ASIO и TinyXML ++ (позже я поменял TinyXML на expat ).Это было не так много работы;Я сделал это сам примерно через неделю, начиная с нуля и заканчивая многими полностью реализованными вызовами RPC.

Boost.ASIO дал отличные результаты.Это, как говорится в его названии, полностью асинхронный и с отличной производительностью при небольших накладных расходах, что для меня было очень важным, потому что оно работало во встроенной среде (MIPS).

Позжеи, возможно, это ваш случай, я изменил XML на Протокол-буферы Google и стал еще счастливее.Его API, а также контейнеры сообщений являются безопасными по типу (то есть вы отправляете int и float, и он никогда не преобразуется в строку и обратно, как в случае с XML), и, как только вы получаете его навык, которое не занимает много времени, его очень продуктивное решение.

Мой совет: если вы можете отказаться от XML, используйте Boost.ASIO + Protobuf
Если вам нужен XML: Boost.ASIO + Expat

Делать этот материал с нуля действительно стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...