Ребус отписывается, когда вы bus.Unsubscribe<SomeMessage>()
.
Если вы столкнулись с тем, что подписчик внезапно перестал получать опубликованные сообщения, это, скорее всего, связано с тем, что ваш издатель каким-то образом "забывает" подписки.
Вы запустили издатель с хранилищем подписки in-mem по умолчанию? Потому что не переживет перезапуск издателя.
Вы почти всегда будете заинтересованы в том, чтобы иметь какой-то способ фактического сохранения подписок, используя, например. SQL Server для этого:
Configure.With(...)
.(...)
.Subscriptions(s => s.StoreInSqlServer(connectionString, "RebusSubscriptions")
.EnsureTableIsCreated())
.(...)
Если вы все еще сталкиваетесь с тем, что кажется случайным образом забытым подписчиком, может быть, это происходит из-за того, что вы переименовали или переместили класс события?
Подписка хранится в хранилище подписки издателя как кортеж (eventType, subscriberInputQueue)
, но фактическое хранение eventType
может различаться в зависимости от выбранного хранилища подписки. Я вижу, что хранилище подписки XML использует имя типа с указанием сборки в качестве его ключа, тогда как хранилище подписки SQL Server использует тип FullName
в качестве ключа, поэтому выбранное хранилище подписки может вести себя немного иначе (что, как я вижу, не оптимально, но это следствие способа абстракция разработана).
Когда издатель публикует, он запрашивает хранилище подписки для подписчиков для данного типа события, поэтому именно этот поиск по какой-то причине не всегда возвращает входную очередь вашего подписчика.
Поскольку в хранилище XML-подписки используется имя с указанием сборки, оно также будет чувствительно к изменениям версии вашей сборки сообщений.
Я надеюсь, что это может дать вам представление о том, почему вы столкнулись с отказом от подписки :)
person
mookid8000
schedule
13.02.2015