Я пытаюсь реализовать шаблон автоматического выключателя. Используя Mule 4.4
.
Я получаю сообщение из очереди Anypoint MQ
, а затем пытаюсь вызвать нижестоящий API.
вот код:
<flow name = "create-emp-flow">
<anypoint-mq:subscriber doc:name = "Subscriber - Create user"
config-ref = "Anypoint_MQ_Configuration" destination = "emp.create.queue}"
acknowledgementMode = "AUTO">
<redelivery-policy maxRedeliveryCount = "1"/>
<anypoint-mq:circuit-breaker tripTimeout = "150000"
onErrorTypes = "HTTP:INTERNAL_SERVER_ERROR,MULE:UNKNOWN" errorsThreshold = "3"/>
</anypoint-mq:subscriber>
<http:request method = "GET" doc:name = "HACK - Mock CALL return a ISE500"
config-ref = "MOCK_Request_Configuration" path = "/emp" >
<http:response-validator >
<http:success-status-code-validator values = "200" />
</http:response-validator>
</http:request>
<error-handler >
<on-error-continue enableNotifications = "true" logException = "true"
doc:name = "On Error Continue" type = "MULE:REDELIVERY_EXHAUSTED">
<anypoint-mq:publish doc:name = "Publish to DLQ"
config-ref = "Anypoint_MQ_Configuration" destination = "emp.dlq" />
</on-error-continue>
<on-error-propagate enableNotifications = "true" logException = "true"
doc:name = "On Error Propagate" >
<logger .../>
</on-error-propagate>
</error-handler>
</flow>
Итак, последовательность такая:
#1 использовать сообщение из очереди ( maxRedeliveryCount=1
)
# 2, затем вызовите конечную точку HTTP - здесь я намеренно возвращаю ошибку 500 ISE.
Примечание: абонент настроен на Circuit breaker
с maxThreshhold = 3
и типами ошибок, при которых срабатывает автоматический выключатель HTTP:INTERNAL_SERVER_ERROR,MULE:UNKNOWN
#3 Теперь, поскольку HTTP-вызов возвращает ISE, исключение в муле отображается как HTTP:INTERNAL_SERVER_ERROR
, и это то, что я хотел бы сгенерировать.
Теперь, когда я настроил повторную доставку, сообщение повторяется еще раз, и в случае неудачи мы достигаем условия MULE:REDELIVERY_EXHAUSTED
, поэтому сообщение публикуется в DLQ.
До этого момента дела идут хорошо. Теперь я публикую несколько сообщений в очередь, и наблюдается то же поведение, что и выше.
Теперь я ожидаю, что автоматический выключатель сработает после того, как третье сообщение будет использовано, повторено и опубликовано в DLQ. После того, как 3-е сообщение ожидало, что последующие сообщения НЕ будут обработаны до истечения 2,5 минут.
Однако абонент, кажется, с удовольствием принимает сообщения, не замечая никаких признаков срабатывания автоматического выключателя.
Примечание. Я хочу использовать <redelivery-policy maxRedeliveryCount = "1"/>
и не полагаться на максимальную доставку, которая настроена в очереди в Anypointmq (по умолчанию 10).
так не уверен, почему автоматический выключатель не срабатывает?
спасибо, изменили сообщение об ошибке, продолжайте распространять сообщение об ошибке, и да, теперь это работает
Из документации Коннектор
Если поток Mule завершает свое выполнение с ошибкой, источник подписчика проверяет, является ли ошибка одним из onErrorTypes, указывающим на ошибку внешней службы, и подсчитывает последовательные появления до тех пор, пока не будет достигнуто errorThreshold.
Поэтому ошибки должны быть последовательными, чтобы схема перешла в «разомкнутое» состояние. Проблема с вашей реализацией в том, что у вас есть ошибка on-error-continue
for REDELIVERY_EXHAUSTED
, что означает, что подписчик будет рассматривать выполнение опроса как успех, а не как ошибку. И, следовательно, это остановит переход схемы в разомкнутое состояние, и счетчик ошибок будет сброшен.
Чтобы заставить его работать с redelivery-policy
, вам необходимо внести следующие изменения:
on-error-continue
на on-error-propogate
on-error-propogate
для ошибки REDELIVERY_EXHAUSTED
, чтобы удалить сообщение из MQ.on-error-propogate
, чтобы сохранить сообщение для следующего опроса.Это заставит источник не считать REDELIVERY_EXHAUSTED
успешным, и схема должна разомкнуться после трех последовательных ошибок (это errorThreshold
).
спасибо @harshank - это сработало! , последний вопрос: как только автоматический выключатель сработает (удерживает/не обрабатывает дальнейшие сообщения в течение указанного времени, можно ли каким-либо образом опубликовать в журналах, что автоматический выключатель был активирован?, это облегчит понимание на производстве через журналы, когда сработал автоматический выключатель)
Что произойдет, если вы прокомментируете ошибку «продолжить»?