2013-04-09 54 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队列中。阅读代码后,您可以看到三点如何结合在一起。

希望这有助于...