开发者

NServiceBus pub/sub - where have my messages gone?

开发者 https://www.devze.com 2023-01-31 10:45 出处:网络
Well I\'ve been doing this NServiceBus project fo开发者_如何学Cr a while and once I got it working for PubSub I then spent the rest of the time on the actual workflow logic.However, I can see a seriou

Well I've been doing this NServiceBus project fo开发者_如何学Cr a while and once I got it working for PubSub I then spent the rest of the time on the actual workflow logic. However, I can see a serious issue which I want to get around (or rather learn how to handle correctly).

A publisher publishes a message to the storage queues of any subscribers as far as I understand. Great. But what happens when the subscriber isn't running (I've read other posts about this and they don't seem to be asking the same question).

Scenario - I get the publisher to Publish a message when no subscribers are running (attached/requested messages to be relayed to them).. I then find that.. the message is "gone" just simply isn't there! where did it go? Did the publisher say "hey, no one's subscribing to this, so I wont bother publishing it?", shouldn't it NOT do that and require at least one subscriber?

Can anyone shed any light on this? (nservicenewbie)


You should publish an event that has happened - a statement of fact, that other handler may or may not be interested in. It's perfectly valid to have zero subscribers! If this is not the case then maybe you should be Send()ing a command instead of Publish()ing an event.

If you are using a persistent subscription storage, start the subscriber up once and it will always be subscribed. If the subscriber is offline, messages for it will pile up in its Input Queue, ready to be processed when the subscriber comes back online.

If you're just testing with NServiceBus, the NServiceBus.Host.exe is running in the Lite profile, which uses in-memory (non-persistant) subscription storage, which would result in what you are seeing.


Ah ha! Well though it's not always an error to have no subscriber for a message type, there is a way to handle it.

In your publisher simply modify the:

IBus Bus

To use (you will need NServiceBus.Core.dll and the NS NServiceBus.Unicast):

IUnicastBus Bus

Then you can attach an handler to:

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

This can then put the message in an error queue.. or perhaps retry forever.. or publish something else etc.. etc.. what ever you want. Thus ensuring there is nothing lost where your particular system (from a business perspective) requires an outcome

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号