C# NServiceBus新手-如何强制通用主机首先加载订户,然后处理消息?

C# NServiceBus新手-如何强制通用主机首先加载订户,然后处理消息?,c#,nservicebus,C#,Nservicebus,我正在测试NServiceBus,我已经完成了以下场景: 1) 从发布服务器向主机发布的消息,而主机尚未运行 2) 启动主机 希望主机将该消息发送给订阅者,但看起来它在加载订阅者之前尝试处理该消息,所以在处理该消息时,还没有订阅者,所以我丢失了消息(为了清楚起见,删除了名称空间): 2012-02-16 13:21:09634信息NServiceBus.Unicast.Transport.Msmq.MsmqTranspo rt[(null)]-您正在运行的软件的社区版 只支持一个线程 2012-

我正在测试NServiceBus,我已经完成了以下场景:
1) 从发布服务器向主机发布的消息,而主机尚未运行
2) 启动主机

希望主机将该消息发送给订阅者,但看起来它在加载订阅者之前尝试处理该消息,所以在处理该消息时,还没有订阅者,所以我丢失了消息(为了清楚起见,删除了名称空间):

2012-02-16 13:21:09634信息NServiceBus.Unicast.Transport.Msmq.MsmqTranspo rt[(null)]-您正在运行的软件的社区版 只支持一个线程

2012-02-16 1321:10918[Worker.5]INFO NServiceBus.Unicast.UnicastBus[(空)] -从发件人处收到ID为b591c15e-ee05-4d28-99da-1BAC16A5ECB\2991的消息ItemCommandGenerator@USER-个人电脑

2012-02-16 13:21:11021[Worker.5]INFO NServiceBus.Unicast.UnicastBus[(空)] -订阅WinFormsReceiver@USER-PC到消息类型ItemEvent

2012-02-16 13:21:11026[Worker.5]INFO NServiceBus.Unicast.UnicastBus[(空)] -订阅Receiver@USER-PC到消息类型ItemEvent

通用主机是使用建模工具生成的,因此默认配置

更新:添加了模型,以便更好地理解正在发生的事情,还重新表述了下面的问题

主机类型为NServiceBusHost

我认为这个问题听起来应该是这样的:我可以在主机中注册订阅者,而不是让订阅者自己注册,或者至少在开始处理消息之前检查是否所有订阅者都已订阅?下面是场景及其默认工作方式:
1) 主机死亡
2) 接收器死亡
3) 生成器生成消息
4) 主机已恢复,其队列中有消息
5) 主机处理消息
6) 接收方被恢复,它订阅了主机,但它的队列是空的,因为主机在步骤5中不知道接收方的情况,因为它为接收方提供了消息


因为现在,在主机恢复并准备好处理消息之后,它不知道会有接收方,所以当它在步骤5中处理消息时,它不会以默认配置将其发送给接收方。

只需在处理任何消息之前启动所有程序,向发布者预先注册订阅者即可。订阅肯定会得到评估。

是的,NServiceBus可以完全按照您所描述的做。您可能会遇到问题,因为您运行的配置文件对您的测试来说不够健壮。默认情况下,示例NSB项目使用内存内订阅运行。这意味着,如果正在发布的主机(在您的情况下为“主机”)关闭,则所有订阅都将丢失。您想查看其他配置文件,如集成和生产配置文件。集成将订阅服务器保存在队列中,生产将订阅服务器保存在数据库中。然后NSB了解是否存在未运行的预期订阅(因为订阅信息是持久化的)

此外,我建议如下: 1) 生成器对主机执行
总线发送()
2) 主机处理消息,然后进行发布
3) 接收器订阅主机

该主机必须配置为发布服务器


希望这能有所帮助。

Em,我如何在通用主机中做到这一点?@Giedrius,你看过可以下载的发布/订阅示例了吗?我看过了,我更新了我的问题,以便更好地反映问题所在。