NServiceBus pub / sub - 哪里有我的消息?

时间:2010-12-16 14:55:55

标签: nservicebus publish-subscribe

好吧,我一直在做这个NServiceBus项目一段时间,一旦我让它为PubSub工作,我就把剩下的时间花在了实际的工作流逻辑上。但是,我可以看到一个我想要解决的严重问题(或者更确切地知道如何正确处理)。

据我所知,发布商会向任何订阅者的存储队列发布消息。大。但是当用户没有运行时会发生什么(我已经阅读了关于此的其他帖子,他们似乎没有问同样的问题)。

场景 - 我让发布者在没有订阅者正在运行时发布消息(附加/请求的消息被转发给他们)。然后我发现...消息“消失了”只是根本不存在!它去了哪里?出版商是否说“嘿,没有人订阅这个,所以我不打算发布它?”,不应该这样做并且至少需要一个用户吗?

任何人都可以对此有所了解吗? (nservicenewbie)

2 个答案:

答案 0 :(得分:4)

你应该发布一个已经发生的事件 - 一个事实陈述,其他处理程序可能会或可能不会感兴趣。拥有零订阅者是完全有效的!如果不是这种情况,那么也许你应该发送命令而不是发布()事件。

如果您使用的是持久订阅存储,请启动订阅者一次,并始终订阅。如果订户处于离线状态,则其消息将堆积在其输入队列中,准备在订户重新联机时进行处理。

如果您只是使用NServiceBus进行测试,则NServiceBus.Host.exe将在Lite配置文件中运行,该配置文件使用内存(非持久性)订阅存储,这将导致您看到的内容。

答案 1 :(得分:3)

啊哈哈!虽然没有消息类型的订阅者并不总是错误,但有一种方法可以处理它。

在您的发布商中,只需修改:

即可
IBus Bus

使用(您需要NServiceBus.Core.dll和NS NServiceBus.Unicast):

IUnicastBus Bus

然后您可以将处理程序附加到:

Bus.NoSubscribersForMessage += .......

然后可以将消息放入错误队列中......或者可能永远重试..或者发布其他东西等等......你想要什么。因此,确保您的特定系统(从业务角度)需要结果的地方没有任何损失