如何處理 Spring Boot 中與快取相關的錯誤?

banq發表於2021-06-18

通常,您的應用程式不太可能嚴重依賴快取。事實上,您可能只是將快取用作提高效能的一種方法。在這種情況下,即使發生與快取相關的錯誤,您的應用程式也可能會順利執行。因此,您甚至可能不會意識到快取系統中的故障,從而難以發現它們。這就是為什麼實施一個系統來正確處理與快取相關的錯誤是必不可少的。
讓我們看看如何在 Java 和 Kotlin 中做到這一點。
為了處理快取失敗,Spring Boot 提供了CacheErrorHandler[url=https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/interceptor/CacheErrorHandler.html] [/url]介面。透過實現它,您可以定義所需的錯誤處理邏輯。然後,您只需將自定義實現註冊為預設錯誤處理程式。讓我們來看看如何完成這兩件事。
 

自定義錯誤處理邏輯

CacheErrorHandler介面提供了以下四種方法:handleCacheGetErrorhandleCachePutErrorhandleCacheEvictError,和handleCacheClearError
每一個旨在幫助您處理發生在註解的方法錯誤@Cachable@CachePut或者@CacheEvict,這是最重要的SpringBoot快取記憶體相關的註解。
您需要做的只是實現CacheErrorHandler介面,在上述四種方法中提供錯誤處理邏輯。

public class CustomCacheErrorHandlerpublic class ErrorHandlingLogic implements CacheErrorHandler {
    @Override
    public void handleCacheGetError(
            RuntimeException e, 
            Cache cache, 
            Object key
    ) {
        // your custom error handling logic
    }

    @Override
    public void handleCachePutError(
            RuntimeException e, 
            Cache cache, 
            Object key, 
            Object value
    ) {
        // your custom error handling logic
    }

    @Override
    public void handleCacheEvictError(
            RuntimeException e, 
            Cache cache, 
            Object key
    ) {
        // your custom error handling logic
    }

    @Override
    public void handleCacheClearError(
            RuntimeException e, 
            Cache cache
    ) {
        // your custom error handling logic
    }
}


kotlin:

class CustomCacheErrorHandler : CacheErrorHandler {
    override fun handleCacheGetError(
        exception: RuntimeException,
        cache: Cache,
        key: Any
    ) {
        // your custom error handling logic
    }

    override fun handleCachePutError(
        exception: RuntimeException,
        cache: Cache,
        key: Any,
        value: Any?
    ) {
        // your custom error handling logic
    }

    override fun handleCacheEvictError(
        exception: RuntimeException,
        cache: Cache,
        key: Any
    ) {
        // your custom error handling logic
    }

    override fun handleCacheClearError(
        exception: RuntimeException,
        cache: Cache
    ) {
        // your custom error handling logic
    }
}

這樣,您可以記錄與快取相關的錯誤,不再忽略它們,或者在發生致命異常時將它們傳送回客戶端。
 

註冊您的自定義 CacheErrorHandler 實現
現在,您必須定義一個CustomachingConfiguration繼承CachingConfigurerSupport. 覆蓋它的errorHandler方法並確保返回CustomCacheErrorHandler上面定義的類的例項。

@Configuration
public class CustomCachingConfiguration extends CachingConfigurerSupport {  
    @Override
    public CacheErrorHandler errorHandler() {
        return new CustomCacheErrorHandler();
    }
    
    // ...
}

kotlin:

@Configuration
class CustomCachingConfiguration : CachingConfigurerSupport() {
    override fun errorHandler(): CacheErrorHandler {
        return CustomCacheErrorHandler()
    }

    // ...
}


您的應用程式現在可以免受與快取相關的故障的影響。

相關文章