В вашем вопросе, вы описываете два критерия, когда сообщение не может быть обработано:
- если сообщение отсутствует некоторая информация или
- некоторые другие критерии еще не встречались
Первым из них является проблема с сообщением, и, похоже, не имеет смысла переупорядочивать сообщение, имеющее проблему. Соответствующее действие - зарегистрировать ошибку и отбросить сообщение (или вызвать любую логику обработки ошибок, содержащую ваше приложение).
Вторая из них довольно расплывчата, но для целей этого ответа предполагается, что проблема связана не с сообщением, а с каким-либо другим компонентом системы (например, с проблемой подключения к сети). В этом случае приложение-потребитель может отправить сообщение Nack
(negative acknowldegement), которое может дополнительно запросить сообщение.
Имейте в виду, что во втором случае необходимо отключить потребителя до тех пор, пока не будет устранено условие ошибки, или сообщение будет повторно отправлено и обработано с ошибкой до бесконечности до тех пор, пока система не вернется в исходное состояние, на необработанном сообщении.
Зачем использовать nack
вместо простой переиздания?
Это установит флаг «redelivered» в сообщении, чтобы вы знали, что он был доставлен один раз уже. Есть other options, а также для обработки плохих сообщений.
, когда сообщение что-то упустило, затем опубликуйте в той же очереди, которая получает сообщение от него? Если это так, вы можете установить 'autoack'' 'false ', и сообщение будет удалено из очереди, если вы не дадите ему. то, если в сообщении отсутствует что-то, no ack, и это сообщение останется в очереди без удаления.Если сообщение является goo, дайте ссылку на эту очередь, это сообщение будет удалено из очереди. – zangw
@zangw да опубликовать в той же очереди, откуда оно было получено. (это трудно объяснить, но в сообщениях есть элемент времени, поэтому он может быть действителен через 5 минут, а не сейчас). –