在 Mule 缓存中使用 DataWeave

Using DataWeave in Mule cache

两个月前,我在 Mulesoft 中配置了一个 EE 缓存。突然间,它停止工作了。事实证明,DataWeave 不能放在缓存范围内。一旦我将它移出范围,它就会再次完美运行。我用这个测试过:

<set-payload value="#[message.inboundProperties.'http.request.uri']" doc:name="Set Payload"/>
        <ee:cache cachingStrategy-ref="EBX_Response_Caching_Strategy" doc:name="Cache">
            <logger message="No entry with key: '#[payload]' was found in the cache. A request will be send to EBX service. Detailed response is returned: #[flowVars.detailedResponse]" level="INFO" doc:name="Logger"/>
            <scripting:transformer encoding="UTF-8" mimeType="application/json" doc:name="Set filter">
                <scripting:script engine="Groovy"><![CDATA[
flowVars['filter'] = 'filtervalue' ]]></scripting:script>
            </scripting:transformer>
            <http:request config-ref="HTTP_Request_Configuration" path="/ebx-dataservices/rest/data/v1/" method="GET" doc:name="EBX HTTP call">
                <http:request-builder>
                    <http:query-param paramName="login" value="${svc0031.login}"/>
                    <http:query-param paramName="password" value="${svc0031.password}"/>
                    <http:query-param paramName="pageSize" value="unbounded"/>
                    <http:query-param paramName="filter" value="#[filter]"/>
                    <http:header headerName="Host" value="myhost.com"/>
                </http:request-builder>
            </http:request>

            </ee:cache>
        <dw:transform-message metadata:id="91c16073-669d-4c27-a3ea-5cbae4e56ede" doc:name="Basic info response">
            <dw:input-payload doc:sample="sample_data\json.json"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{
    hotels: payload.rows map ((row , indexOfRow) -> {
        name: row.content.companyName.content,
        propertyCode: row.content.propertyCode.content,
    })
}]]></dw:set-payload>
        </dw:transform-message>

如果我在缓存范围内移动 DataWeave 转换,缓存就会停止工作并且总是向后端系统发送请求。 这是为什么? MuleSoft 改变了什么吗?我们 运行 ESB 3.7.3

您正在缓存范围内使用可消耗的有效载荷,当我们使用可消耗的有效载荷时,缓存始终是一个 MISS,即使在使用缓存后,缓存范围内的处理器也会再次处理。 在您的情况下,您使用的是 HTTP 请求程序,它将为您提供可消费的响应,因此缓存策略将被放弃。 解决方案是使用 'Byte Array to Object' 消耗流并使响应不可消耗,以便缓存将其缓存在内存中,下次它将成为缓存命中,它将从内存缓存中获取。 您的另一个选择是在缓存范围内使用 Dataweave,这也会消耗您的传入流并使缓存成为 HIT。

有关缓存命中和未命中以及可消耗响应的更多信息,请访问此处: https://docs.mulesoft.com/mule-user-guide/v/3.7/cache-scope