So, I am fairly new with Mulesoft and I have taken the fundamentals class.
I thought I would make it easier on my devs and create a template for them to start development with. Everything was going fine until I got to exception handling. The choice exception strategy below is supposed to use a boolean value, pagerDuty.active, to determine whether to POST exception data to the Pager Duty service. I realize that my JSON Body is not correct yet but even with that I cannot understand why the web service is failing with a 404 and the payload is getting corrupted. Here are the global elements that are defined in 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>
And then here is definition of just the exception strategy:
<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("Element")]"
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="#[{"service_key": "flowVars.serviceKey", "event_type": "trigger", "incident_key": "${workflowName}", "description": "#[flowVars.message]", "details": { "Failure Context": "${env}", "Stack Trace": "#[flowVars.stackTrace]" }}] "
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 == "success"]">
<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>
Can anyone see anything obviously wrong with this? I can't get this to work at all and this is how I induced an exception to test it:
<?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>
Any help is greatly appreciated, frankly Mulesoft documentation is sorely lacking on this!
I believe the problem is with this line of code:
<catch-exception-strategy when="#[${pagerDuty.active}]"
You are trying to catch an exception based on a Boolean value,the outcome of a Boolean value cannot be considered as an exception.
A flow will be transferred to any exception strategy only when an exception occurs in your flow. If there is no exception then the execution of flow wont be transferred to the catch exception strategy.
So you need to define your code like:
<catch-exception-strategy when="#[exception.causedBy("the exception")]"
to catch an exception