Будут ли непостоянные сообщения JMS доставляться недолговечным подписчикам? - PullRequest
0 голосов
/ 08 ноября 2019

Допустим, я отправляю сообщение недолговечному подписчику, но подписчик не может подтвердить сообщение. Будет ли сервер пытаться повторно доставить сообщение или же доставка будет осуществляться только для постоянных подписчиков? Зависит ли результат от того, было ли сообщение постоянным или непостоянным?

В книге Марка Ричардса «Служба сообщений Java» я не нашел четкого ответа, но два, казалось бы, противоречивых утверждения:

Метод Подтверждения () информирует провайдера JMS, что сообщение было успешно получено потребителем. Этот метод генерирует исключение для клиента, если в процессе подтверждения происходит сбой поставщика. Ошибка провайдера приводит к тому, что JMS-сервер сохраняет сообщение для повторной доставки.

Это может означать, что сообщение доставлено.

Сообщение может быть потеряно, еслипровайдеру не удается доставить сообщение потребителю с недлительной подпиской. Если постоянный подписчик получает сообщение и происходит сбой до того, как подтверждение будет возвращено поставщику, то поставщик JMS считает сообщение недоставленным и попытается повторно доставить его.

Хорошо, поэтому сообщение может быть утерянным, то есть не доставленным, но от каких обстоятельств это зависит?

Существует ли даже вариант использования для комбинации надежных подписчиков и непостоянных сообщений?

1 Ответ

0 голосов
/ 08 ноября 2019

Каждое утверждение, которое вы цитируете, по существу указывает на то, что конечный результат зависит от того, столкнулся ли провайдер с «неудачей». Ответ на ваш вопрос зависит от того, что это за сбой.

В первой цитате о подтверждении сообщения я полагаю, что автор говорит о сбое в брокере во время процесса подтверждения, когда процесс посредника остается, ноне удается из-за какой-то внутренней причины.

Во второй цитате о недолговечных подписках я полагаю, что автор говорит о сбое посредника во время процесса доставки сообщения потребителю, когда процесс посредника завершенпо какой-то причине (например, сбой JVM, сбой оборудования и т. д.). В этом случае любые сообщения в недлительной подписке будут потеряны, поскольку подписка фактически недолговечная.

Как разработчик брокера, я не считаю это сообщение "потерянным", посколькуse, потому что это ожидаемая семантика недлительной подписки. Поскольку он недолговечен, он не должен выживать после перезапуска брокера (независимо от основной причины перезапуска). Я считаю потерю сообщения неожиданным удалением сообщения. Брокер никогда не должен терять сообщения.

...