Обработка исключений и прерывания потока в Mule 3.9


У меня проблема с одним кейсом в Mule 3.9. У меня есть свой API, созданный с помощью этого файла .raml. Одна из конечных точек - это просто GET с маршрутом «/» (в целях тестирования). В этом потоке (управление GET /) я хотел бы вызвать другой поток для проверки sth (в моем случае проверка JWT). Когда действительно, я хотел бы перейти и вернуть исходную полезную нагрузку. Если он недействителен, я вызываю исключение в Groovy, что действительно происходит, но, в конце концов, оно касается той же исходной полезной нагрузки, которая не должна быть видна.

Напишем код:

исходный поток:

        <flow-ref name="validate_jwt_token" doc:name="Validate JWT"/>

        <set-payload value=" { &quot;message&quot; : &quot;API is working!&quot;}" doc:name="Set Payload" mimeType="application/json" />
    </flow>

и исх .:

<flow name="validate_jwt_token">
        <logger message="Request found with Authorization: #[message.inboundProperties['authorization']]" level="INFO" doc:name="Loger Authorization"/>
        <component doc:name="Validate JWT Token">
            <spring-object bean="ValidateJWTEvent"/>
        </component>
        <choice doc:name="Choice">
             <when expression="(payload == true)">
                <logger message="JWT valid. Access granted." level="INFO" doc:name="Logger"/>
            </when>
             <otherwise>

                <scripting:component doc:name="Throw Exception">
                    <scripting:script engine="Groovy"><![CDATA[throw new Exception('Invalid JWT Token.')]]></scripting:script>
                </scripting:component>
            </otherwise>
        </choice>
          <catch-exception-strategy doc:name="Catch Exception Strategy">
            <set-property propertyName="http.status" value="401" doc:name="Set 401 status"/>
            <flow-ref name="commons.exceptionStrategy.logError" doc:name="Log errors"/>
        </catch-exception-strategy>


    </flow>

И даже если этот токен действительно недействителен, я получаю ту же полезную нагрузку с текстом «API IS WORKING». Я хочу поймать исключение и вернуть HTTP ERROR. Больше ничего.

Я также прилагаю свою стратегию исключения. Имейте в виду, что он основан на APIKIT, сгенерированном моим Mule itselft .raml.

 <sub-flow name="commons.exceptionStrategy.logError">
        <logger message="Error: #[exception.?cause.message or exception]" level="ERROR" doc:name="Logger" />

        <set-property propertyName="Content-Type" value="application/json" doc:name="Set Content Type"/>
        <flow-ref name="log_params" doc:name="log_params"/>
        <logger message="#[org.apache.commons.lang3.StringEscapeUtils.escapeJson(exception.?getCauseException().?getMessage())]" level="ERROR" doc:name="Display error"/>
        <set-payload value="{ &quot;responseHeader&quot;: { &quot;requestId&quot;: &quot;#[flowVars.storedRequestId]&quot;, &quot;sendDate&quot;: &quot;#[function:now]&quot;}, &quot;code&quot;: &quot;#[flowVars.'statusCode']&quot;, &quot;message&quot;: &quot;#[flowVars.errorMessage or org.apache.commons.lang3.StringEscapeUtils.escapeJson(exception.?getCauseException().?getMessage())]&quot; }" doc:name="Set Error Message"/>
     </sub-flow>

 <sub-flow name="log_params">

<logger message="API| endpoint executed with payload: #[message.payload]" level="INFO" doc:name="log payload"/>
        <logger message="API| endpoint executed with flowVars: #[flowVars]" level="INFO" doc:name="log params"/>

        </sub-flow>

Весь API используется APIKIT my Mule со стратегией Global Catch Exception.

Пожалуйста, помогите мне, ребята.


person deyvw    schedule 23.03.2020    source источник
comment
Покажите, пожалуйста, стратегию исключения, чтобы понять, как обрабатывается ошибка.   -  person aled    schedule 23.03.2020
comment
Выполнено. Я отредактировал это сообщение выше.   -  person deyvw    schedule 25.03.2020


Ответы (1)


Похоже, вы перехватываете исключение в том же потоке, в котором его выбрасываете. Следовательно, он не распространяется, и поток не прерывается, поскольку исключение обрабатывается. Попробуйте вместо этого использовать стратегию отката-исключения, которая изменит полезную нагрузку, но распространит исключение на ссылку потока вызывающего абонента и прервет этот поток. HTH

person afelisatti    schedule 03.04.2020