การจัดการข้อยกเว้นและการขัดจังหวะโฟลว์ใน Mule 3.9


ฉันมีปัญหากับหนึ่งกรณีใน Mule 3.9 ฉันสร้าง API ด้วยไฟล์ .this .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 ไม่มีอะไรเพิ่มเติม

ฉันกำลังแนบ Exception-Strategy ของฉันด้วย โปรดจำไว้ว่ามันใช้ APIKIT ซึ่งสร้างไฟล์ Mule ของฉันเองเป็น .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 Strategy

โปรดช่วยฉันด้วย


person deyvw    schedule 23.03.2020    source แหล่งที่มา
comment
โปรดแสดงกลยุทธ์ข้อยกเว้นเพื่อทำความเข้าใจวิธีจัดการกับข้อผิดพลาด   -  person aled    schedule 23.03.2020
comment
เสร็จแล้ว. ฉันได้แก้ไขโพสต์ข้างต้นนี้แล้ว   -  person deyvw    schedule 25.03.2020


คำตอบ (1)


ดูเหมือนว่าคุณกำลังจับข้อยกเว้นในโฟลว์เดียวกับที่คุณกำลังโยนมัน ดังนั้นจึงไม่มีการแพร่กระจายและการไหลไม่ถูกขัดจังหวะเนื่องจากมีการจัดการข้อยกเว้น ลองใช้กลยุทธ์การย้อนกลับข้อยกเว้นแทน ซึ่งจะแก้ไขเพย์โหลด แต่เผยแพร่ข้อยกเว้นไปยังการอ้างอิงโฟลว์ผู้เรียกและขัดจังหวะโฟลว์นั้น ฮ

person afelisatti    schedule 03.04.2020