Продолжить посредничество последовательности после тайм-аута в посреднике вызовов

Конечные точки могут иметь три конфигурации тайм-аута. Никогда не истекайте тайм-аутом, не сбрасывайте и не ошибайтесь. Мне отчаянно нужно продолжить поток после тайм-аута. Есть ли способ добиться этого? Обработчик ошибок (последовательность onError) не является желательным решением этой проблемы. Представьте себе оркестровку с восемью посредниками вызовов, мне нужно было бы создать восемь последовательностей и установить друг друга как ошибку. Это очень быстро приведет к раздуванию углеродных приложений, сделает код нечитаемым и увеличит время развертывания.


person Tomáš Toka Mrázek    schedule 30.04.2021    source источник
comment
Зависит ли остальная часть посредничества от ответа на вызов конечной точки?   -  person Shanaka Premarathna    schedule 01.05.2021
comment
И да и нет. Пример из реальной жизни, мы используем настраиваемый шаблон, который регистрирует запрос к базе данных, вызывает целевую конечную точку, регистрирует ответ в базу данных. Это уровень абстракции, в основном наша настраиваемая структура. Теперь у нас есть несколько вариантов использования, в которых мы хотим вызвать одну систему, а если это не удается, независимо от того, как это сделать, вызвать другую систему. По сути, это фильтр, в котором мы проверяем данные и, если данные не найдены, вызываем вторую систему с другим запросом. Проблема в том, что тайм-аут останавливает посредничество, очищает стек продолжения и вызывает обработчик ошибок. Мне нужно вызвать посредника, чтобы не выполнять последовательность ошибок, а продолжить.   -  person Tomáš Toka Mrázek    schedule 24.05.2021
comment
Из приведенного выше примера очевидно, почему мы не можем использовать последовательность onError. Мы можем установить только одну последовательность onError в шаблоне абстракции, но каждый вариант использования должен реагировать по-разному, они не могут совместно использовать эту последовательность ошибок.   -  person Tomáš Toka Mrázek    schedule 24.05.2021


Ответы (1)


По сути, в любой момент времени состояние конечной точки может быть одним из следующих.

  1. Активный
  2. Тайм-аут
  3. Приостановить
  4. ВЫКЛЮЧЕННЫЙ

Когда конечная точка находится в состоянии тайм-аута, она будет продолжать попытки получать сообщения до тех пор, пока одно сообщение не будет успешным или не будет достигнуто максимальное значение повторной попытки. Если достигается максимум, конечная точка помечается как приостановленная. Если одно сообщение завершается успешно, конечная точка помечается как Активная.

Если вам нужно продолжить поток посредничества, когда вы получаете тайм-аут конечной точки в соответствии с конфигурацией тайм-аута конечной точки, вы можете использовать параметр ошибка в responseAction.

Затем, когда конечная точка истекает по таймауту, сработает последовательность сбоев (пользовательская последовательность сбоев, если вы ее уже определили, в противном случае - последовательность сбоев по умолчанию). Если вам нужно продолжить поток посредничества и в соответствии с существующей реализацией, вы можете определить необходимую логику посредничества в настраиваемой последовательности и вызвать эту последовательность в последовательности сбоя следующим образом.

    <?xml version="1.0" encoding="UTF-8"?>
<sequence name="customFaultSequence" xmlns="http://ws.apache.org/ns/synapse">
    <!-- Log the message at the full log level with the ERROR_MESSAGE and the ERROR_CODE-->
    <log level="full">
         <property name="MESSAGE" value="Executing default 'fault' sequence"/>
         <property expression="get-property('ERROR_CODE')" name="ERROR_CODE" xmlns:ns="http://org.apache.synapse/xsd"/>
         <property expression="get-property('ERROR_MESSAGE')" name="ERROR_MESSAGE" xmlns:ns="http://org.apache.synapse/xsd"/>
    </log>
    <sequence key="afterTimeoutEndpointSequence"/>
</sequence>

Пример прокси-сервиса:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestProxy" startOnLoad="true" statistics="disable" trace="disable"    transports="http,https">
   <target faultSequence="customFaultSequence">
      <inSequence>
               <endpoint>
                  <address uri="http://run.mocky.io/v3/51c11e65-55a7-47e5-ba38-1d86e8e5d7ea?mocky-delay=45000ms">
                     <timeout>
                        <duration>2</duration>
                        <responseAction>fault</responseAction>
                     </timeout>
                  </address>
               </endpoint>
           <respond/>
      </inSequence>
   <description/>
</proxy>
person KAsara    schedule 01.05.2021
comment
Как я уже сказал, обработчик ошибок (а именно в данном случае) не является приемлемым решением. Мне нужно продолжить медиатон после вызова посредника в той же последовательности, а не в другой последовательности. Я не хочу использовать error responseAction и в основном вызываю последовательность onError, это то, что мы делали в течение года, и это начинает ужасно превращаться в чистый код. - person Tomáš Toka Mrázek; 24.05.2021
comment
@ TomášMrázek, в соответствии с текущей архитектурой, вы должны следовать вышеуказанному подходу для достижения ваших требований. - person KAsara; 04.06.2021