Mulesoft 3.8.1 中的这种选择异常策略有问题吗?

Is there something wrong with this choice exception strategy in Mulesoft 3.8.1?

所以,我是 Mulesoft 的新手,我已经掌握了基础知识 class。

我想我会让我的开发者更容易,并为他们创建一个模板来开始开发。在我进行异常处理之前,一切都很顺利。下面的选择异常策略应该使用一个布尔值,pagerDuty.active,来决定是否POST异常数据到Pager Duty服务。我意识到我的 JSON 正文还不正确,但即便如此我还是无法理解为什么 Web 服务失败并显示 404 并且有效负载已损坏。以下是 global.xml:

中定义的全局元素
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:secure-property-placeholder="http://www.mulesoft.org/schema/mule/secure-property-placeholder"
    xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/secure-property-placeholder http://www.mulesoft.org/schema/mule/secure-property-placeholder/current/mule-secure-property-placeholder.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/apikit http://www.mulesoft.org/schema/mule/apikit/current/mule-apikit.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">
    <context:property-placeholder location="${env}.properties"/>
    <http:listener-config name="httpListenerConfig" host="0.0.0.0" port="${http.port}" doc:name="HTTP Listener Configuration"/>
    <http:request-config name="HttpConfiguration_GetTheBearerToken" host="${accountTranslation.host}" port="${accountTranslation.port}" basePath="/" doc:name="HttpConfiguration_GetTheBearerToken"/>
    <http:request-config name="HttpConfiguration_TranslateAccountNumbers" host="${accountTranslation.host}" port="${accountTranslation.port}" basePath="/api" doc:name="HTTP Request Configuration">
        <http:raml-api-configuration location="https://anypoint.mulesoft.com/apiplatform/repository/v2/organizations/95208566-ca0c-48df-8e18-22377534fd5e/public/apis/5521343/versions/103885/files/root"/>
    </http:request-config>
    <db:generic-config name="ERP_Integration_Database_Connector_Configuration" url="jdbc:sqlserver://${sqlServer.ip}:${sqlServer.port};databaseName=${sqlServer.database};user=${sqlServer.user};password=${sqlServer.password}" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" doc:name="Generic Database Configuration"/>
    <http:request-config name="HttpRequest_PagerDuty" host="${pagerDuty.host}" port="${pagerDuty.port}" basePath="/" doc:name="HTTP Request Configuration" protocol="HTTPS"/>
</mule>

然后这里是异常策略的定义:

    <choice-exception-strategy name="templateChoice_Exception_Strategy">
        <catch-exception-strategy when="#[${pagerDuty.active}]"
            doc:name="Catch Exception Strategy with Pager Duty">
            <set-variable variableName="exceptionPayload"
                value="#[groovy:message.getExceptionPayload()]" doc:name="Get the exception payload" />
            <choice doc:name="Choice">
                <when expression="#[flowVars.exceptionPayload != null]">
                    <set-variable variableName="message"
                        value="#[exceptionPayload.getMessage()]" doc:name="Get the message" />
                    <set-variable variableName="stackTrace"
                        value="#[exceptionPayload.info.get(&quot;Element&quot;)]"
                        doc:name="Get the Stack Trace" />
                </when>
                <otherwise>
                    <set-variable variableName="message" value="Unknown exception"
                        doc:name="Default message" />
                    <set-variable variableName="stackTrace"
                        value="The stack trace was not available" doc:name="Default stack trace" />
                </otherwise>
            </choice>
            <set-variable variableName="serviceKey" value="${pagerDuty.serviceKey}" doc:name="Variable"/>
            <set-payload
                value="#[{&quot;service_key&quot;: &quot;flowVars.serviceKey&quot;,  &quot;event_type&quot;: &quot;trigger&quot;,  &quot;incident_key&quot;: &quot;${workflowName}&quot;, &quot;description&quot;: &quot;#[flowVars.message]&quot;,  &quot;details&quot;: { &quot;Failure Context&quot;: &quot;${env}&quot;, &quot;Stack Trace&quot;: &quot;#[flowVars.stackTrace]&quot; }}] "
                mimeType="application/json" doc:name="Set the JSON Body" encoding="US-ASCII" />
            <http:request config-ref="HttpRequest_PagerDuty" path="${pagerDuty.basePath}"
                method="POST" doc:name="Post to Pager Duty" />
            <dw:transform-message metadata:id="0c07879b-66b0-4a52-879b-2635c3c92ed5"
                doc:name="Transform Message">
                <dw:input-payload />
                <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
{
    Status: payload.status,
    Message: payload.message,
    IncidentKey: payload.incident_key   
}
]]></dw:set-payload>
            </dw:transform-message>
            <choice doc:name="Choice">
                <when expression="#[payload.Status == &quot;success&quot;]">
                    <logger message="Exception logged for #[payload.IncidentKey]"
                        level="DEBUG" doc:name="Logger" />
                </when>
                <otherwise>
                    <logger
                        message="Failed to log exception Status: #[payload.Status] Message: #[payload.Message] Incident: #[payload.IncidentKey]"
                        level="ERROR" doc:name="Logger" />
                </otherwise>
            </choice>
        </catch-exception-strategy>
        <catch-exception-strategy doc:name="Catch Exception Strategy no Pager Duty"
            when="#[${pagerDuty.active} == false]">
            <logger
                message="Exception: #[groovy:message.getExceptionPayload().getRootException.getMessage()]"
                level="ERROR" doc:name="Logger" />
        </catch-exception-strategy>
    </choice-exception-strategy>

有人能看出这有什么明显的错误吗?我根本无法让它工作,这就是我引发异常来测试它的方式:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"
    xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/apikit http://www.mulesoft.org/schema/mule/apikit/current/mule-apikit.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
    <flow name="mainFlow">
        <http:listener config-ref="httpListenerConfig" path="/testMe" doc:name="HTTP"/>
        <flow-ref name="GetBearerToken" doc:name="GetBearerToken"/>
        <db:select config-ref="ERP_Integration_Database_Connector_Configuration" doc:name="Get the accounts to process">
            <db:parameterized-query><![CDATA[SELECT DISTINCT
        CASE 
            WHEN DynamicsCompanyNumber = 2 THEN 'TVI'
            WHEN DynamicsCompanyNumber = 15 THEN 'SRU'
            WHEN DynamicsCompanyNumber = 16 THEN 'SAP'
            WHEN DynamicsCompanyNumber = 18 THEN 'VVSP'
            WHEN DynamicsCompanyNumber = 21 THEN 'UNIQ'
            WHEN DynamicsCompanyNumber = 40 THEN 'UNIC'
            WHEN DynamicsCompanyNumber = 42 THEN 'SWMC'
            WHEN DynamicsCompanyNumber = 43 THEN 'ADSU'
            WHEN DynamicsCompanyNumber = 44 THEN 'ADSC'
        END CompanyName
        ,Acct2, Acct3, Acct4, '' LedgerDimension
FROM dbo.GLTransactions glt WITH (NOLOCK)
    INNER JOIN dbo.GLBatch gl WITH (NOLOCK) ON gl.GLBatchID = glt.GLBatchID
UNION
SELECT DISTINCT
        CASE 
            WHEN DynamicsCompanyNumber = 2 THEN 'TVI'
            WHEN DynamicsCompanyNumber = 15 THEN 'SRU'
            WHEN DynamicsCompanyNumber = 16 THEN 'SAP'
            WHEN DynamicsCompanyNumber = 18 THEN 'VVSP'
            WHEN DynamicsCompanyNumber = 21 THEN 'UNIQ'
            WHEN DynamicsCompanyNumber = 40 THEN 'UNIC'
            WHEN DynamicsCompanyNumber = 42 THEN 'SWMC'
            WHEN DynamicsCompanyNumber = 43 THEN 'ADSU'
            WHEN DynamicsCompanyNumber = 44 THEN 'ADSC'
        END CompanyName
        ,OffsetAcct2, OffsetAcct3, OffsetAcct4, '' LedgerDimension
FROM dbo.GLTransactions glt WITH (NOLOCK)
    INNER JOIN dbo.GLBatch gl WITH (NOLOCK) ON gl.GLBatchID = glt.GLBatchID]]></db:parameterized-query>
        </db:select>
        <set-variable variableName="nullRef" value="#[null]" mimeType="text/plain" doc:name="Set var to null"/>
        <expression-component doc:name="induce null ref"><![CDATA[#[flowVars.nullRef[0]] ]]></expression-component>
        <flow-ref name="GetTheDistinctAccounts" doc:name="GetTheDistinctAccounts"/>
        <logger message="Processed #[sessionVars.accountMap.size()] records and ignored #[sessionVars.accountsNotMapped.size()] records" level="INFO" doc:name="Logger"/>
        <set-payload value="#['Not Mapped records:' + sessionVars.accountsNotMapped + 'Mapped records:' + sessionVars.accountMap.values()]" mimeType="text/plain" doc:name="Set Payload"/>
        <exception-strategy ref="templateChoice_Exception_Strategy" doc:name="Reference Exception Strategy"/>
    </flow>
</mule>

非常感谢任何帮助,坦率地说,Mulesoft 文档非常缺乏这方面的内容!

我认为问题在于这行代码:

 <catch-exception-strategy when="#[${pagerDuty.active}]"

您正试图捕获基于布尔值的异常,布尔值的结果不能被视为异常。

只有当您的流程发生异常时,流程才会转移到任何异常策略。如果没有异常则流程的执行不会转移到捕获异常策略。 所以你需要像这样定义你的代码: <catch-exception-strategy when="#[exception.causedBy("the exception")]" 捕获异常