2016-08-25 105 views
0

兩個月前,我在Mulesoft中配置了一個EE緩存。突然,它停止工作。事實證明,DataWeave不能放在緩存範圍內。一旦我將其移出示波器,它就會再次完美運行。我這個測試:在Mule緩存中使用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改造,高速緩存剛剛停止工作,並請求總是被髮送到backendsystem。 這是爲什麼? MuleSoft改變了一些事情嗎?我們正在使用ESB 3.7.3

回答

1

您正在Cache範圍中使用消耗性負載,並且當我們使用消耗性有效負載時,Cache始終是MISS,即使在使用Cache之後,Cache作用域內的處理器也會再次處理。 就你而言,你正在使用一個HTTP請求者,它會給你一個消費品的迴應,因此緩存策略正在被放棄。 解決方案是使用'Byte Array to Object'來消耗流並使響應爲非消耗性,以便緩存將其緩存到內存中,並且下次它將成爲Cache-HIT並且它將從內存中提取緩存。 你的其他選擇是在Cache Scope內部使用Dataweave,它也會消耗你的傳入流並使Cache成爲HIT。

有關高速緩存命中和未命中和耗材的反應更多信息請點擊這裏: https://docs.mulesoft.com/mule-user-guide/v/3.7/cache-scope

+0

好吧,我很困惑。我把代碼的方式正常工作。我的意思是,如果我向該進程發出3個相同的請求,則只有第一個請求調用後端系統,結果兩個請求將從緩存中獲取。如果我將Dataweave移動到緩存作用域內,我們總是會轉到後端系統,而不是緩存,這不是我們想要的。如果我說得對,你說的話恰恰相反。我很困擾。 –

+0

您可以重寫我的代碼,以便Dataweave將在緩存中?在此先感謝 –

+0

我在我的接口中使用高速緩存範圍,並且我有一個HTTP請求來生成訪問令牌...現在我將該訪問令牌請求放入高速緩存範圍內,並且每次都嘗試打高速緩存,它總是打個電話並避免Cache。現在,如果我在HTTP請求者之後將字節數組添加到對象,它將從緩存中獲取...即使我在HTTP之後放置數據織物,緩存也可以正常工作。原因是我正在消耗傳入的HTTP流,導致有效負載不可使用。所以嘗試添加一個字節數組到對象變換器IF dataweave無法使用緩存作用域中的ur HTTP – srbhvatsa