NServiceBus酒吧/酒吧-我的消息到哪里去了?

NServiceBus酒吧/酒吧-我的消息到哪里去了?,nservicebus,publish-subscribe,Nservicebus,Publish Subscribe,我已经做了一段时间的NServiceBus项目,一旦我让它为PubSub工作,我就把剩下的时间花在实际的工作流逻辑上。然而,我可以看到一个我想要回避的严重问题(或者更确切地说,学习如何正确处理) 据我所知,发布者将消息发布到任何订阅者的存储队列中。伟大的但是当订阅者没有运行时会发生什么(我读过其他关于这方面的帖子,他们似乎没有问同样的问题) 场景-我让发布者在没有订阅者运行时发布消息(附加/请求的消息将转发给他们)。。然后我发现。。信息“消失”了,只是根本不存在!它去哪里了?出版商有没有说“嘿,

我已经做了一段时间的NServiceBus项目,一旦我让它为PubSub工作,我就把剩下的时间花在实际的工作流逻辑上。然而,我可以看到一个我想要回避的严重问题(或者更确切地说,学习如何正确处理)

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

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


有人能解释一下吗?(服务新手)

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

在publisher中,只需修改以下内容:

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

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

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

这样就可以将消息放入错误队列中。。或者永远重试。。或者发表其他东西等等。。等不管你想要什么。因此,确保在您的特定系统(从业务角度)需要结果的地方不会丢失任何东西

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

在publisher中,只需修改以下内容:

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

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

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

这样就可以将消息放入错误队列中。。或者永远重试。。或者发表其他东西等等。。等不管你想要什么。因此,确保在您的特定系统(从业务角度)需要结果时不会丢失任何东西

您应该发布一个已经发生的事件—一个其他处理程序可能感兴趣或可能不感兴趣的事实陈述。零用户是完全有效的!如果不是这样,那么您可能应该发送()命令,而不是发布()事件

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


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

您应该发布已发生的事件—其他处理程序可能感兴趣或可能不感兴趣的事实陈述。零用户是完全有效的!如果不是这样,那么您可能应该发送()命令,而不是发布()事件

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


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

因此,据我目前所知,没有“连接”订阅服务器并不一定是错误的。但在我的现实生活场景中,您需要先启动发布者(它正在中读取消息以进行发布),然后启动订阅者。在订阅服务器启动之前,发布服务器可能已经发布了一堆消息!所以这些基本上是丢失的,工作流操作“被困”在某些“过程中”状态中。我可以修改nServiceBus的发布方法。。但我真的不想……所以从我目前的理解来看,没有订户被“附加”并不一定是错误的。但在我的现实生活场景中,您需要先启动发布者(它正在中读取消息以进行发布),然后启动订阅者。在订阅服务器启动之前,发布服务器可能已经发布了一堆消息!所以这些基本上是丢失的,工作流操作“被困”在某些“过程中”状态中。我可以修改nServiceBus的发布方法。。但是我真的不想..谢谢David-我怎么知道主机exe是否在Lite配置文件中运行?关于Send方法-是的,听起来我应该使用Send。但是,如果您说在非精简模式下,如果订阅服务器(本地)处于脱机状态,这些已发布的消息将在队列中简单地累积,那么应该使用此方法。配置文件由命令行参数选择。如果不提供,则默认为Lite。请参阅感谢David-如何判断主机exe是否在Lite配置文件中运行?关于Send方法,请参见您的观点-是的,听起来我应该使用Send。但是,如果您说在非精简模式下,如果订阅服务器(本地)处于脱机状态,这些已发布的消息将在队列中简单地累积,那么应该使用此方法。配置文件由命令行参数选择。如果不提供,则默认为Lite。看见