Как я могу автоматически истечь сообщения в подписке Azure Service Bus?
Документация по BrokeredMessage гласит:
Если TTL, установленный в сообщении отправителя, превышает TTL получателя, то TTL сообщения будет перезаписано более поздним значением. См. DefaultMessageTimeToLive, DefaultMessageTimeToLive и DefaultMessageTimeToLive, чтобы узнать больше о том, как управлять TTL сообщения на уровне объекта.
Итак, чтобы добиться автоматического удаления сообщений из моей подписки "Журнал", при создании подписки я установил SubscriptionDescription.DefaultMessageTimeToLive
собственность на TimeSpan.FromDays(5)
,
Когда я создаю и отправляю сообщение брокера, оставляя TimeToLive
свойство этого сообщения к значению по умолчанию, когда я проверяю сообщения, поступающие в этой подписке, ExpiresAtUtc
свойство для сообщений 31-12-9999 23:59
, и TimetoLive
свойство 10675199.02:48:05.4775807
, Поскольку TTL для подписки "назначение" составляет 5 дней, я ожидал бы значение 5.00:00:00
там.
Есть ли что-то еще, что мне нужно сделать, чтобы это работало?
Действия по воспроизведению с помощью Service Bus Explorer 2.2.1.0
- Подключение к пространству имен служебной шины на Azure
- Создать новую тему "MyTopic"
- Создайте подписку "Журнал" под темой и установите для параметра Время сообщения по умолчанию значение 5 дней.
- Щелкните правой кнопкой мыши узел темы MyTopic и выберите "Отправить сообщение"
- На экране "Отправка сообщений в MyTopic": нажмите "Пуск"
- Нажмите на узел подписки "Журнал"
- Нажмите кнопку "Сообщения" и выберите Peek 10
- Нажмите на сообщение в списке
- Посмотрите на поле TimeToLive в области "Свойства сообщения"
3 ответа
Очевидно, что значение TTL для заглядываемых сообщений не имеет смысла:
Такое поведение в настоящее время разработано и должно рассматриваться независимо от версии SDK: эффективный TTL является минимальным TTL сообщения и объекта и проверяется во время выполнения, а не впечатывается в сообщение во время постановки в очередь (поскольку TTL уровня объекта может быть изменилось в любое время после того, как сообщения были поставлены в очередь). Документация вводит в заблуждение и должна быть исправлена.
Этот ответ был дан в этой ветке MSDN: http://social.msdn.microsoft.com/Forums/windowsazure/en-US/dfe58dbb-186d-4c71-a708-8f6f7267b451/when-peeking-for-messages-the-time-to-live-value-seems-not-to-be-set-is-this-a-bug
Вы должны установить свойство DefaultMessageTimeToLive при создании самой очереди, а не при создании клиента очереди. Попробуйте удалить очередь и создать ее снова с новым описанием очереди.
Вам необходимо войти в свою тему и установить "Время сообщения по умолчанию для жизни" на 14 дней.
Что пошло не так? К счастью, эта ошибка не требует пояснений и указывает на то, что максимальный размер темы составляет 1 ГБ (1073741824 байта), в то время как тема уже использует 1073742326 байтов, что соответствует ограничению примерно в 1 ГБ. Мы вошли на портал Azure и подтвердили то же самое. Затем мы запустили Service Bus Explorer, чтобы проверить состояние сообщений. Мы видели тысячи сообщений в Темах.
Почему сообщения не удалялись из темы? Теперь возникает очевидный вопрос, что держит эти тысячи сообщений в теме. После некоторого расследования мы обнаружили, что "Время сообщения по умолчанию для жизни" для темы было установлено на очень большое число. В этом случае он был установлен на 1 год. Чтобы решить эту проблему, мы установили "Время сообщения по умолчанию для жизни" на 2 дня, как рекомендовано разработчиком приложения. Это решило проблему. Вот снимок экрана конфигурации из портала управления Azure: