2016-08-25 10 views
0

Два месяца назад я сконфигурировал кеш EE в Mulesoft. Внезапно он прекратил работать. Оказалось, что DataWeave не может быть помещен в область кеша. Как только я выхожу из сферы действия, он отлично работает. Я тестировал с этим:Использование DataWeave в кэше Mule

<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 в объем кэша, кэширование просто перестает работать и посылается запрос на backendsystem всегда. Почему? MuleSoft что-то изменил? Мы работаем на ESB 3.7.3

ответ

1

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

Для получения дополнительной информации о кэше пробах и ошибках и расходных ответах идет сюда: https://docs.mulesoft.com/mule-user-guide/v/3.7/cache-scope

+0

Хорошо, я запутался. Как я правильно положу код. Я имею в виду, что если я сделаю 3 одинаковых запроса к этому процессу, только первый сделает вызов бэкэнд-системы, а последующие два получат его из кеша. Если я перемещаю Dataweave внутри области кеша, мы всегда переходим к бэкэнд-системе, без кеша, чего мы не хотим. То, что вы говорите, если я правильно понимаю, это совершенно противоположное. Я очень смущен. –

+0

Можете ли вы переписать мой код так, чтобы Dataweave попал в кеш? Заранее спасибо –

+0

Я использую область Cache в моем интерфейсе, и там у меня есть HTTP-запрос для создания токена доступа ... Теперь я поместил этот запрос токена доступа в область Cache и каждый раз пытаюсь нажать Cache, он всегда делает вызов и избегает кеша. Теперь, если я поместил массив байтов в объект после HTTP-реквестера, он берет из кэша ... Даже если я поместил данные после HTTP, Cache отлично работает. Причина в том, что я потребляю входящий поток HTTP, который делает полезную нагрузку не потребляемой. Поэтому попробуйте добавить массив байтов в объект-трансформатор. IF dataweave не сможет потреблять ur HTTP в области кеша. – srbhvatsa