簡體   English   中英

Spring Boot根據請求禁用@Cacheable

[英]Spring Boot disable @Cacheable per request

我試圖基於URL參數禁用Spring Boot中的Cacheable函數。 例如http://myapplication.com/some/request?cache=false

我曾用SpEL嘗試過這種情況,但無法使其正常工作

@Cacheable(value = "value", keyGenerator = "keygenerator", condition = "#{someComponent.isCacheEnabled()}")

有什么建議么? 提前致謝!

user4843-

我假設您的“任意組件”(即someComponent )是您的Spring ApplicationContextSpring托管bean?

如果是這樣,則您沒有使用@Cacheable注釋聲明內的condition屬性指定的SpEL表達式正確引用此Spring托管bean。 它應該顯示為...

condition="#{@someComponent.isCacheEnabled()}"

請注意,在someComponent上使用了@符號, 此處將對其進行詳細說明。 並且,盡管Spring 文檔尚不清楚,但這確實暗示了在處理緩存注釋時,除了使用“內置參數”或SpEL約定外 ,SpEL評估上下文是在Spring的Cache Abstraction中創建和使用的。 表36.1-Cache SpEL可用元數據中列出的那些。 在這里查看示例。

我還要提醒您使用某些任意組件或Spring托管Bean來像這樣管理整個應用程序的緩存狀態。

  1. 首先,如果someComponentSingleton Bean( Spring容器中的默認值),則此Bean需要是線程安全的,尤其是在其狀態不斷變化的情況下(似乎在每個HTTP請求中都在變化),這導致我...

  2. 我不確定如果緩存狀態取決於每個單獨的HTTP請求,那么您不確定是否需要Spring托管的bean管理應用程序服務/存儲庫方法的“可緩存狀態”,尤其是因為大多數HTTP容器在單獨的線程中處理每個HTTP請求。 您肯定會遇到種族問題。 在這種情況下,我寧願使用一個額外的可緩存服務方法參數來確定特定服務方法調用的可緩存狀態,該狀態源自HTTP請求。

例:

@Cacheable(value = "value", keyGenerator="keyGenerator" conditional="#enableCaching")
public <return-type> someCacheableServiceMethod(..., boolean enableCaching) {
  ...
}

實際上,我什至建議使用更易理解的面向業務的規則來確定服務方法的可緩存狀態。

希望這可以幫助!

-約翰

暫無
暫無

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

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