簡體   English   中英

如何緩存數據庫查詢結果,並避免無論傳入請求如何,緩存都無法處理m子消息?

[英]How to Cache DB Query Result and avoid cache from processing the mule message irrespective of incoming request?

我正在從數據庫緩存第三方API URL,后續的傳入消息必須使用此URL才能訪問第三方系統。

目前,每當我對傳入請求進行任何更改時,都會再次從DB加載URL,並一次又一次發送相同的請求,然后從高速緩存中獲取URL。

但是我希望URL第一次被加載,然后無論傳入請求中的內容如何,​​都應該從緩存中獲取該URL。

請讓我知道該怎么做?

MULE XML:

<http:listener-config name="HTTP_Listener_Configuration" host="localhost" port="8081" doc:name="HTTP Listener Configuration"/>
<http:request-config name="HTTP_Request_Configuration" host="lcdre342.cdr-p01.chp.bankofamerica.com" port="20108" basePath="/ngen/AdministerAccountRelationshipManagement/V001/administer-accounts" doc:name="HTTP Request Configuration"/>
<http:request-config name="HTTP_Outgoing_Request" host="#[sessionVars.api_url]" port="${mule.env.port}" doc:name="HTTP Request Configuration"/>
<context:property-placeholder location="${mule.env}.properties"/>
<db:generic-config name="Generic_Database_Configuration" url="jdbc:db2://db2dvipa9sd92t.bankofamerica.com:446/D92T:user=${mule.env.dbuserName};password=${mule.env.dbPassword};" driverClassName="com.ibm.db2.jcc.DB2Driver" doc:name="Generic Database Configuration"/>
<ee:object-store-caching-strategy name="API_Url_cache" doc:name="Caching Strategy">
    <managed-store storeName="API URL Managed Store" persistent="true" maxEntries="1" entryTTL="600000" expirationInterval="6000"/>
</ee:object-store-caching-strategy>
<flow name="ringfencedemoFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/administer-accounts" allowedMethods="POST" doc:name="HTTP">
        <http:response-builder statusCode="#[message.inboundProperties.'http.status']" reasonPhrase="#[message.inboundProperties.'http.reason']">
            <http:header headerName="x-boa-site-affinity" value="#[message.inboundProperties.'x-boa-site-affinity']"/>
            <http:header headerName="x-boa-site-affinity-wcc" value="#[message.inboundProperties.'x-boa-site-affinity-wcc']"/>
            <http:header headerName="x-boa-trace-id" value="#[message.inboundProperties.'x-boa-trace-id']"/>
        </http:response-builder>
    </http:listener>
    <object-to-string-transformer doc:name="Object to String"/>
    <logger message="#[payload]" level="INFO" doc:name="Input Request Logger"/>
    <set-variable variableName="inputMsg" value="#[payload]" doc:name="Put input request into variable"/>
    <ee:cache doc:name="Cache" cachingStrategy-ref="API_Url_cache" filterExpression="#[payload.isEmpty() == false]">
        <db:select config-ref="Generic_Database_Configuration" doc:name="Get API url from DB">
            <db:parameterized-query><![CDATA[select data_value from ${mule.env.schemavalue}.XWCCSYSPARM where GROUPREFID='WCCD' and CATEGORY='MULE' and KEY_ID='WCC_API_URL' and SEQ_NUM=0]]></db:parameterized-query>
        </db:select>
    </ee:cache>
    <set-session-variable variableName="api_url" value="#[payload.get(0).DATA_VALUE]" encoding="UTF-8" mimeType="text/plain" doc:name="Set Api url in session variable"/>
    <set-payload value="#[flowVars.inputMsg]" encoding="UTF-8" mimeType="application/xml" doc:name="Set back input request in payload"/>
    <http:request config-ref="HTTP_Outgoing_Request" path="${mule.env.path}" method="POST" doc:name="Call to WCC System">
        <http:request-builder>
            <http:header headerName="x-boa-user-id" value="#[message.inboundProperties.'x-boa-user-id']"/>
            <http:header headerName="X-BOA-Trace-ID" value="#[message.inboundProperties.'X-BOA-Trace-ID']"/>
            <http:header headerName="X-BOA-RDS-Auth-ChannelId" value="#[message.inboundProperties.'X-BOA-RDS-Auth-ChannelId']"/>
            <http:header headerName="X-BOA-RDS-Auth-AppId" value="#[message.inboundProperties.'X-BOA-RDS-Auth-AppId']"/>
            <http:header headerName="X-BOA-Security-Token" value="#[message.inboundProperties.'X-BOA-Security-Token']"/>
            <http:header headerName="X-BOA-User-ID-Type" value="#[message.inboundProperties.'X-BOA-User-ID-Type']"/>
            <http:header headerName="X-BOA-Originator-Component" value="#[message.inboundProperties.'X-BOA-Originator-Component']"/>
        </http:request-builder>
        <http:success-status-code-validator values="200,400,207"/>
    </http:request>
    <object-to-string-transformer doc:name="Object to String"/>
   <!--  <component doc:name="PrettyPrintXML" class="org.boa.format.PrettyPrintXML"/> -->
    <logger message="#[payload]" level="INFO" doc:name="Response logger"/>
</flow>

您需要在緩存策略上設置keyGenerationExpression屬性,如下所示:

<ee:object-store-caching-strategy name="API_Url_cache" doc:name="Caching Strategy"
keyGenerationExpression="#[flowVars.someConstantVariable]">
   <managed-store storeName="API URL Managed Store" persistent="true" maxEntries="1" entryTTL="600000" expirationInterval="6000"/>
</ee:object-store-caching-strategy>

緩存條目基於生成的密鑰存儲在緩存中。 下次執行緩存范圍時,會將新生成的密鑰與存儲的密鑰進行匹配,以決定它是CACHE HIT還是CACHE MISS。

在您的情況下,由Mule的默認密鑰生成器生成的密鑰可能對於每個消息請求都是唯一的。 因此,每次都會執行緩存范圍。

https://docs.mulesoft.com/mule-user-guide/v/3.8/cache-scope- 在此處輸入圖片說明

恆定密鑰生成的幾個示例:

// Generates same key whenever payload is not empty
keyGenerationExpression="#[!payload.isEmpty()]" 

// Generates same key for a calendar month
keyGenerationExpression="#[server.dateTime.month]" 

HTH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM