Использование DataWeave в кеше Mule

Два месяца назад я настроил кеш EE в Mulesoft. Внезапно он перестал работать. Оказалось, что 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


person Stanislav Ivanov    schedule 25.08.2016    source источник


Ответы (1)


Вы используете расходную полезную нагрузку в области кэша, и когда мы используем расходную полезную нагрузку, то кеш всегда является MISS, и ваши процессоры внутри области кэша будут обрабатывать снова даже после использования кэша. В вашем случае вы используете запросчик HTTP, который даст вам ответ Consumable, и поэтому от стратегии кеширования отказываются. Решение заключается в использовании байтового массива для объекта, чтобы потреблять поток и сделать ответ непотребляемым, чтобы кэш кэшировал его в памяти, и в следующий раз это будет Cache-HIT, и он будет забираться из кеша в памяти . Другой вариант для вас - использовать Dataweave внутри Cache Scope, который также будет использовать ваш входящий поток и сделать кеш HIT.

Дополнительную информацию о Cache HIT и MISS и ответах на расходные материалы можно найти здесь: https://docs.mulesoft.com/mule-user-guide/v/3.7/cache-scope

person srbhvatsa    schedule 25.08.2016
comment
Хорошо, я запутался. То, как я помещаю код, работает правильно. Я имею в виду, что если я сделаю 3 одинаковых запроса к этому процессу, только первый вызовет внутреннюю систему, а следующие два получат его из кеша. Если я перемещаю Dataweave внутрь области кеширования, мы всегда переходим к бэкэнд-системе, без кеша, чего мы не хотим. Если я правильно понимаю, вы скажете прямо противоположное. Я очень смущен. - person Stanislav Ivanov; 25.08.2016
comment
Не могли бы вы переписать мой код так, чтобы Dataweave находился внутри кеша? заранее спасибо - person Stanislav Ivanov; 25.08.2016
comment
Я использую область кеширования в своем интерфейсе, и там у меня есть HTTP-запрос для создания токена доступа ... Теперь я помещаю этот запрос токена доступа в область кеширования и каждый раз, когда пытаюсь нажать кеш, он всегда выполняет вызов и избегает кеширования. Теперь, если я помещаю байтовый массив в объект после HTTP Requester, он берет из кеша ... Даже если я помещаю dataweave после HTTP, кеш работает нормально. Причина в том, что я использую входящий поток HTTP, что делает полезную нагрузку непотребляемой. Поэтому попробуйте добавить массив байтов в преобразователь объектов, ЕСЛИ dataweave не может использовать ur HTTP в области кеширования. - person srbhvatsa; 26.08.2016
comment
Он работает с байтовым массивом в строку, но не с байтовым массивом в объект - person Stanislav Ivanov; 26.08.2016