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

标签 java json mule anypoint-studio

所以,我对 Mulesoft 还很陌生,而且我已经参加了基础类(class)。

我想我可以让我的开发人员更轻松,并为他们创建一个模板来开始开发。一切都很顺利,直到我开始异常处理。下面的选择异常策略应该使用 boolean 值 pagerDuty.active 来确定是否将异常数据 POST 到 Pager Duty 服务。我意识到我的 JSON Body 还不正确,但即使如此,我也无法理解为什么 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}]"

您正在尝试根据 boolean 值捕获异常, boolean 值的结果不能被视为异常。

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

关于java - Mulesoft 3.8.1中的这个选择异常策略有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40371422/

相关文章:

c# - 反序列化 JSON 并断言响应

c# - JSON 序列化列表<KeyValuePair<string, object>>

java - 如何处理在Mule中扩展AbstractMessageTransformer的Java类中的FileNotFoundException?

error-handling - 没有这样的操作: HTTP GET PATH_INFO:/services/EchoUMO

骡子 ESB : How to use rules in DataMapper for condition checking

c# - 使用 WCF 使用 RESTful JSON API

java - 具有多个框架的 GUI

java - Eclipse - Swing WindowBuilder 在 JList<E> 代码解析上出现错误

java - 在java中使用iText创建pdf

java - 如何分析运行Tomcat的嵌入式H2数据库的内存消耗?