我正在测试NServiceBus并且我已经完成了以下方案:
1)发布者向主持人发布消息,而主持人尚未运行
2)开始主持人
并且希望,主机会将该消息发送给订阅者,但看起来它在加载订阅者之前尝试处理消息,因此在处理它时自然没有订阅者,所以我丢失了我的消息(删除了)为了清楚起见,名称空间):
2012-02-16 13:21:09,634 1 INFO NServiceBus.Unicast.Transport.Msmq.MsmqTranspo rt [(null)]<(null)> - 您正在运行该软件的社区版本 只支持一个帖子。
2012-02-16 1321:10,918 [Worker.5] INFO NServiceBus.Unicast.UnicastBus [(null)] ≤(NULL)> - 收到消息ItemCommand,来自发件人Generator @ USER-PC的ID为b591c15e-ee05-4d28-99da-1bac1a6a5ecb \ 2991
2012-02-16 13:21:11,021 [Worker.5] INFO NServiceBus.Unicast.UnicastBus [(null)] ≤(NULL)> - 将WinFormsReceiver @ USER-PC订阅到消息类型ItemEvent
2012-02-16 13:21:11,026 [Worker.5] INFO NServiceBus.Unicast.UnicastBus [(null)] ≤(NULL)> - 将Receiver @ USER-PC订阅到消息类型ItemEvent
通用主机是使用建模工具生成的,因此默认配置。
更新:添加模型以更好地了解正在发生的事情,还在下面重述了问题
主机类型为NServiceBusHost
我认为问题应该是这样的:我可以在主机中注册订阅者,没有订阅者自己注册或者至少要检查,如果所有订阅者都在开始处理消息之前订阅了吗?这是场景以及它默认如何工作:
1)主机模具
2)接收器模具
3)生成器生成消息
4)主机被恢复,其队列中有消息
5)主机处理消息
6)接收器被恢复,它订阅了主机,但它的队列是空的,因为主机在接收到消息时,在步骤5中不知道接收器。
因为现在,在Host被恢复并准备好处理消息后,它不知道会有接收器,所以当它在步骤5中处理消息时,它不会在默认配置中将它发送给接收器
答案 0 :(得分:3)
是的,NServiceBus可以完全按照您的描述进行操作。您可能遇到问题,因为您没有在足够强大的测试配置文件中运行。默认情况下,示例NSB项目使用内存中订阅运行。这意味着如果正在发布的主机(在您的情况下为“主机”)关闭,则所有订阅都将丢失。您想要查看其他配置文件,例如集成和生产配置文件。集成将订户保存在队列中,Production将订户保存在数据库中。然后,NSB了解是否存在未满足的预期订阅(因为订阅信息是持久的)。
此外,我建议如下:
1)Generator生成Bus.Send()
到主机
2)主机处理消息,然后进行发布
3)Receiver订阅主持人
这必须将主机配置为发布者。
希望这有帮助。
答案 1 :(得分:0)
只需在尝试处理任何邮件之前启动所有内容,即可向您的发布商预先注册订阅者。那么订阅肯定会得到评估。