1

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

据我了解,发布者将消息发布到任何订阅者的存储队列。伟大的。但是当订阅者没有运行时会发生什么(我已经阅读了其他关于这个的帖子,他们似乎没有问同样的问题)。

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

任何人都可以对此有所了解吗?(服务新手)

4

2 回答 2

4

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

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

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

于 2010-12-16T16:37:13.517 回答
3

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

在您的发布者中只需修改:

IBus Bus

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

IUnicastBus Bus

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

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

然后,这可以将消息放入错误队列中..或者可能永远重试..或发布其他内容等等..等等..任何你想要的。从而确保在您的特定系统(从业务角度)需要结果的地方不会丢失任何东西

于 2010-12-16T15:48:16.550 回答