Я использовал ServiceStack некоторое время назад, и мне хорошо известно о предпочтительном дизайне API на основе сообщений, и это то, что я использую в некоторых API на основе REST.
библиотеку Redis / MQ и, как всегда, наслаждайтесь структурой и функциональностью ServiceStack. Тем не менее, я пытаюсь заменить некоторый устаревший коммуникационный код на сервер MQ, и протестировал некоторые примеры SS , и он работает хорошо.
Однако с некоторым устаревшим кодом я работаю использует один и тот же класс для исходящего запроса и ответа, поэтому отправляется GetSomething
, а ответ является экземпляром того же класса GetSomething
, но со свойством, например GetSomething.Result
, которое содержит ответ / результат.
Поскольку мне нужна была прямая замена текущей модели связи, я посмотрел, может ли этот сценарий поддерживаться "из коробки", но я действительно не нашел ничего, что могло бы решить эту проблему. Когда я делаю подобные вещи в Consumer, у которого есть Handler:
mqHost.RegisterHandler<GetSomething>(base.ExecuteMessage);
, и у издателя, который хочет получить ответ:
mqServer.RegisterHandler<GetSomething>(m => {...});
, происходит то, что издатель забирает запрос немедленно, и он никогда не достигает Потребителя. Если я удалю прослушиватель ответа в издателе, он достигнет потребителя, но когда потребитель затем отвечает тем же DTO, GetSomething
, он застревает в вечном l oop, потому что я думаю об ответе помещается в ту же очередь MQ.
Есть ли разумный способ решить эту проблему с помощью ServiceStack?
У меня есть некоторые идеи возможных обходных путей, но я хотел бы знать, можно ли это решаться лучше и разумнее.