Ребусы отписываются автоматически?

В какое время отписывается ребус? Есть ли что-нибудь, что автоматически отменяет подписку через некоторое время, если подписчик не работает?

У меня были некоторые ситуации, когда казалось, что когда служба подписки была остановлена ​​​​в течение определенного периода времени, издатель не продолжает отправлять сообщения своим путем. Что я могу делать неправильно?


person René Larsen    schedule 12.02.2015    source источник


Ответы (1)


Ребус отписывается, когда вы 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
comment
Я использовал хранилище Xml и хранилище SqlServer, поэтому нет, я не использую хранилище в памяти. - person René Larsen; 13.02.2015
comment
Так что это не проблема. Я не мог быть уверен, но мне кажется, что это происходит, когда подписчик был остановлен (красиво), но нет явного кода отмены подписки. Но, очевидно, он не делает этого последовательно. Я просто также хотел убедиться, что не будет автоматической отмены подписки, потому что служба была отключена в течение некоторого времени. - person René Larsen; 13.02.2015
comment
Вы сделали что-то, что изменило либо FullName, либо AssemblyQualifiedName типа? Я расширил ответ дополнительными предложениями относительно того, что может вас обмануть :) - person mookid8000; 14.02.2015