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