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. После прочтения кода вы можете увидеть, как эти три точки связаны друг с другом.

Надеюсь это поможет...

Другие вопросы по тегам