2013-04-09 59 views
4

需要做些什麼才能使InMemoryTransientMessageService在後臺線程中運行?我發佈的東西用ServiceStack:如何使InMemoryTransientMessageService在後臺運行

base.MessageProducer.Publish(new RequestDto()); 

服務內,他們的服務請求立即裏面exececuted。

該項目是自主託管的。

這裏是表示而不是將其推遲到背景的當前請求的阻塞快速單元測試:

+0

什麼消息提供您使用? MSMQ。 – Shashi 2013-04-09 10:08:10

+0

ServiceStack中的InMemoryTransientMessageService,它是一個簡單的內存中隊列。所以隊列的目的是讓主叫方儘可能少地等待,而不是確保消息被100%保證被處理。如果我想這樣,我可以使用Redis:https://github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis – mattias 2013-04-09 11:37:22

回答

1

沒有什麼開箱。你將不得不建立自己的。看看ServiceStack.Redis.Messaging.RedisMqHost--大多數你需要的是在那裏,它可能比ServiceStack.Redis.Messaging.RedisMqServer(一個用於隊列監聽的線程,每個工作者一個線程)要簡單一些(一個線程可以完成所有任務)。我建議你參加這個課程並根據你的需要進行調整。

幾個要點:

  • ServiceStack.Message.InMemoryMessageQueueClient沒有實現WaitForNotifyOnAny(),因此您需要讓後臺線程等待傳入消息的另一種方式。
  • 緊密相關的是,ServiceStack.Redis實現使用主題訂閱,在這個類中用於傳輸WorkerStatus.StopCommand,這意味着你必須找到一種讓後臺線程停止的另一種方法。
  • 最後,您可能需要修改ServiceStack.Redis.Messaging.RedisMessageProducer,因爲它的Publish()方法將請求的消息推送到隊列,並將通道/隊列名稱推送到TopicIn隊列中。閱讀代碼後,您可以看到三點如何結合在一起。

希望這有助於...