ServiceStack: как заставить InMemoryTransientMessageService работать в фоновом режиме
Что нужно сделать, чтобы InMemoryTransientMessageService работал в фоновом потоке? Я публикую вещи внутри службы, используя
base.MessageProducer.Publish(new RequestDto());
и они исполняются сразу внутри сервис-запроса.
Проект является самостоятельным.
Вот быстрый модульный тест, показывающий блокировку текущего запроса вместо того, чтобы отложить его до фона:
1 ответ
Там нет ничего из коробки. Вы должны построить свой собственный. Взгляни на ServiceStack.Redis.Messaging.RedisMqHost
- большая часть того, что вам нужно, есть, и, вероятно, проще (один поток делает все), чтобы начать работу по сравнению с ServiceStack.Redis.Messaging.RedisMqServer
(один поток для прослушивания очереди, один для каждого работника). Я предлагаю вам взять этот класс и адаптировать его к вашим потребностям.
Несколько указателей:
ServiceStack.Message.InMemoryMessageQueueClient
не реализуетWaitForNotifyOnAny()
поэтому вам понадобится альтернативный способ получения фонового потока для ожидания входящих сообщений.- Тесно связанная, реализация ServiceStack.Redis использует подписки на темы, которые в этом классе используются для передачи
WorkerStatus.StopCommand
Это означает, что вы должны найти альтернативный способ остановки фонового потока. - Наконец, вы можете адаптировать
ServiceStack.Redis.Messaging.RedisMessageProducer
как егоPublish()
Метод отправляет запрошенное сообщение в очередь и передает имя канала / очереди в очередь TopicIn. После прочтения кода вы можете увидеть, как эти три точки связаны друг с другом.
Надеюсь это поможет...