#mule #mule-studio #anypoint-studio #mulesoft #mule-esb
#mule #mule-studio #anypoint-studio #mulesoft #mule-esb
Вопрос:
Я пытаюсь использовать сценарий, в котором mule должен повторно отправлять сообщение на конечную точку для определенного случая ошибки. например: сервер не работает -503 502.. Я не мог использовать untilsuccefull processor, поскольку нет возможности установить, для каких кодов ошибок он должен репостить. Итак, я пытаюсь использовать простую логику потока, чтобы справиться с этим. В разделе onErrorcontinue я устанавливаю счетчик и пытаюсь опубликовать то же сообщение. Где мне нужно перевести поток в спящий режим на минуту. Как я могу это сделать в Mule4? Я не вижу никакого процессора сна.
Я следую этому руководству https://www.tutorialsatoz.com/retry-mechanism-until-success-vs-flow-reference /
Ответ №1:
Вы можете использовать функцию ожидания внутри скрипта DW, но я бы не рекомендовал ее — все время выполнения будет ждать.
%dw 2.0
import * from dw::Runtime
output application/json
---
{
a: now()
} wait 4000 // wait 4 seconds
Комментарии:
1. Как говорит Алекс, использование wait() или sleep() в Java / Groovy может повлиять на всю вашу среду выполнения и вызвать проблемы с производительностью и даже сбои.
2. @alex, итак, как бэкэнд-реализация выполняется в UnitilSuccesfull processor? Разве это не механизм ожидания и репоста? На самом деле мне нравится использовать Unitillsuccesfull, но он будет пытаться выполнить все ошибки. Но я не хочу этого делать. Только при сбое сервера, ошибках подключения я хочу опубликовать сообщение
3. Я использую среду выполнения Mule 4.3. Я не хочу снижать производительность сервера. Это экспоненциальный механизм повторных попыток, который я пытаюсь использовать в mule4.3
Ответ №2:
Техника, представленная в статье, использует две плохие практики:
- Использование sleep() в Mule 4
- Использование рекурсивного потока ref
Вы можете использовать sleep() в скрипте Groovy в качестве статьи или использовать функцию wait () DataWeave, как предложено в ответе @Alex, это действительно плохая идея в Mule 4. Причина в том, что эти методы используют потоки с интенсивным использованием процессора, которые являются очень ограниченным ресурсом в Mule 4. В документации для wait() четко указано, что он может вызывать проблемы, и его предполагается использовать только в целях тестирования, и его не следует использовать в производственном приложении:
Остановка выполнения заблокирует используемый поток, что может привести к замедлению, низкой производительности и, возможно, зависанию всей среды выполнения. Эта операция предназначена для ограниченного функционального тестирования и не должна использоваться в производственных приложениях, тестировании производительности или при развертывании нескольких приложений.
Вы можете немного смягчить эту проблему, создав свой собственный модуль sleep с помощью Mule SDK и убедившись, что операция принудительно использует пул БЛОКИРУЮЩИХ потоков.
Другой альтернативой является использование Mule 4.3, который использует единый пул потоков для всех видов выполнения.
Использование рекурсивной ссылки на поток может привести к неустранимой ошибке переполнения стека, и это не рекомендуется и не предназначено для выполнения в Mule 4.
Вместо этого метода вы можете попытаться использовать <raise-error>
inside an <until-successful>
, чтобы вызвать пользовательскую ошибку, если требуемые условия не выполнены.
Комментарии:
1. @ aled, я использую среду выполнения Mule 4.3. итак, как бэкэнд-реализация выполняется в UnitilSuccesfull processor? Разве это не механизм ожидания и репоста? На самом деле мне нравится использовать Unitillsuccesfull, но он будет пытаться выполнить все ошибки. Но я не хочу этого делать. Только для сбоев сервера, ошибок подключения я хочу перепечатать сообщение. Я не хочу снижать производительность сервера.