как сделать поток спящим в Mule4?

#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:

Техника, представленная в статье, использует две плохие практики:

  1. Использование sleep() в Mule 4
  2. Использование рекурсивного потока 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, но он будет пытаться выполнить все ошибки. Но я не хочу этого делать. Только для сбоев сервера, ошибок подключения я хочу перепечатать сообщение. Я не хочу снижать производительность сервера.