2017-12-21 9 views
0

キャッシングのRESTサービスにSpringブートとヘビキャストを使用しています。私は、カスタムキージェネレータでspring @ Cachableアノテーションを使用してサービスレイヤー(API)にキャッシングしています。私がエラーシナリオを処理するために追加したカスタムエラークラスによって処理されないカスタムキージェネレータ関数からのRuntimeExceptionを除いて、すべてのものが正常に動作します。 org.springframework.cache.annotation.CachingConfigurerSupportを拡張し、GET、PUT、EVICTエラーを処理するすべての関数をオーバーライドするカスタムエラークラス(CacheErrorHandler)。私の場合、カスタムcustomKeyGeneratorがRuntimeExceptionをスローするとhandleCacheGetError関数に侵入することが予想されます。 私はここで欠けているものを指摘したり、説明を助けたりすることで、キャッシュ(HAZELCASTやREDISなど)のキャッシングエラーをバネアノテーション(@Cachableを使用)で処理する正しい方法です。試料としてSpringブートに基づくRESTサービス、ハローキャストによるスプリングキャッシング、キャッシュエラーの処理に失敗しました

、ここでこの

@Configuration 
public class CacheConfiguration extends CachingConfigurerSupport { 
... 

@Override 
    public CacheErrorHandler errorHandler() { 
     return new CustomHZCacheErrorHandler(); 
    } 
... 
} 

のように見えますが、ここでCustomHZCacheErrorHandler

public class CustomHZCacheErrorHandler implements CacheErrorHandler { 
    private static final Logger logger = LoggerFactory.getLogger(CustomHZCacheErrorHandler.class); 

    public CustomHZCacheErrorHandler() { 
    } 

    public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) { 
     logger.warn("Error while getting cache " + cache.getName() + " for Key " + key); 
    } 

    public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) { 
     logger.warn("Error while putting cache " + cache.getName() + " for Key " + key); 
    } 

    public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) { 
     logger.warn("Error while evicting cache " + cache.getName() + " for Key " + key); 
    } 

    public void handleCacheClearError(RuntimeException exception, Cache cache) { 
     logger.warn("Error while clearing cache " + cache.getName()); 
    } 
} 
のように見える、CachingConfigurerSupportを拡張し、私のキャッシュ・コンフィギュレーション・クラス、私のAPIのキャッシングは同様

@Cacheable(cacheNames = "TestCache",keyGenerator = "customKeyGenerator") 
public Response getAPIResponse(Integer param1){ 
... 
} 

次のようになります

答えて

1

@NRA、Spring Doc、https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/interceptor/CacheErrorHandler.htmlCacheErrorHandlerは、キャッシュプロバイダによってスローされた例外のみを使用しました。 Key Generator用ではなく、注釈付きメソッドによってスローされた例外についても例外ではありません。

ご覧ください。MVCコントローラ用のhttps://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java#L71

を、春には、あなたがエラーを処理するのに役立つ注釈があります:@ErrorHandlerhttps://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

MVCを使用しない場合は、Aspect Bean &を定義して、そのメソッド/クラス/パッケージのすべてのエラーを処理することができます。トリックはKeyGeneratorというメソッドの前にインターセプターを使用して呼び出されるため、それをキャッチするためにそのKeyGeneratorクラスにもアスペクトを置く必要があります。

この作業例を参照してください。https://gist.github.com/gokhanoner/026c2b90fe3a61b93626383a61932395

注:私は、キャッシュプロバイダ側から例外を投げるテストしていない、あなたはおそらくその部分のためにもCacheErrorHandlerを定義する必要があります。

+0

Springのドキュメントでは、MVCのエラーとキャッシュプロバイダのエラーを処理する意味があります。あなたが参照しているgithubの例は実行されませんでしたが、コード生成時に、サービス層でRunGetExceptionがスローされています。これは、keyGeneration中ではなく、generate()関数内です。何らかの理由で指定されたパラメータが有効でなく、キャッシュキーの作成に使用できない場合は、RuntimeExceptionをスローします。私はあなたの提案をAspectを使って処理しようとしますが、例外を処理し、ログに記録してサービスAPIで続行するのに十分であるかどうか再度確認します。 – NRA

+0

@NRA、私は実行中の例をコピーしました。あなたが望むなら私はプロジェクトを共有することができます。あなたがこの例を実行すると、これはあなたが持っている例外です。これはAspect Iによってキャプチャされたものです: –

+0

2017-12-22 13:58:56.625 ERROR 1896 --- [main] cecachetest.AfterThrowingExample:Object orgのエラーを処理します。 .springframework.cache.interceptor.KeyGenerator.generate(Object、Method、Object [])。引数:[[email protected]、public java.lang.String com.example.cachetest.DummyService.get(java.lang.Integer)、[Ljava.lang.Object; @ 63dd899] java。ラング。ArrayIndexOutOfBoundsException:1 com.example.cachetest.CustomKeyGenerator.generate(CacheTestApplication.java:66)〜[classes /:na] –

関連する問題