Я хотел бы знать, ожидаемое ли ниже поведение для идемпотентного потребителя Camel:
У меня есть removeOnFailure=true для маршрута, что в основном означает, что при сбое обмена идемпотентный потребитель должен удалить идентификатор из репозитория. Это приводит к очень интересному сценарию, который позволяет дублировать на бирже.
Предположим, что у меня идентификатор = 12345, и первая попытка выполнить обмен была успешной, что означает, что идентификатор добавлен в идемпотентный репозиторий. Следующая попытка использовать тот же идентификатор, т. е. 12345, завершается неудачно, так как это перехватывается как повторяющееся сообщение (CamelDuplicateMessage). Но в этот момент наличие removeOnFailure=true удалит идентификатор из репозитория, что при следующей попытке позволит успешно пройти обмен без перехвата сообщения по умолчанию. Отсюда и создание места для дублирования на бирже.
Может кто-нибудь посоветовать, это ожидаемое поведение или какая-то ошибка?
Пример маршрута:
from("direct:Route-DeDupeCheck").routeId("Route-DeDupeCheck")
.log(LoggingLevel.DEBUG, "~~~~~~~ Reached to Route-DeDupeCheck: ${property.xref}")
.idempotentConsumer(simple("${property.xref}"), MemoryIdempotentRepository.memoryIdempotentRepository()) //TODO: To replace with Redis DB for caching
.removeOnFailure(true)
.skipDuplicate(false)
.filter(exchangeProperty(Exchange.DUPLICATE_MESSAGE).isEqualTo(true))
.log("~~~~~~~ Duplicate Message Found!")
.to("amq:queue:{{jms.duplicateQueue}}?exchangePattern=InOnly") //TODO: To send this to Duplicate JMS Queue
.throwException(new AZBizException("409", "Duplicate Message!"));