2014-12-30 23 views
7

Ho abilitato il caching nella mia app Spring e io uso Redis per servire allo scopo. Tuttavia, ogni volta che si verifica un errore di connessione, l'app smette di funzionare, mentre penso che sia meglio saltare la cache e andare avanti con il normale flusso di esecuzione.Spring Cache con Redis - Come gestire con garbo o addirittura saltare la cache in caso di errore di connessione con Redis

Quindi, qualcuno ha qualche idea su come farlo con grazia in primavera?

Ecco l'eccezione che ho ricevuto.

Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 

risposta

6

a partire dalla primavera Framework 4.1, c'è un CacheErrorHandler che è possibile implementare per gestire tali eccezioni. Per ulteriori dettagli, consultare to the javadoc.

È possibile registrarlo con la classe @Configuration estesa a CachingConfigurerSupport (vedere errorHandler()).

+0

Grazie mille per il tuo suggerimento. La mia classe '@ Configuration' estende già SpringBootServletInitializer, quindi, ho provato a implementare CacheErrorHandler direttamente dalla mia classe' @ Configuration'. Tuttavia, non sembra gestire nulla come RedisConnectionFailureException. –

+0

Dove hai visto esattamente un riferimento a 'SpringBootServletInitializer'? Ho scritto 'CachingConfigurerSupport' - Per questo è necessario Spring Boot 1.2 (Spring 4.1). –

+0

CacheErrorHandler viene utilizzato solo durante le operazioni di cache. Un errore di connessione Redis potrebbe verificarsi più in alto? –

0

Simile a ciò che Stephane ha menzionato, l'ho fatto immettendo l'errore nel blocco di prova. Aggiungendo un meccanismo di fallback dove se Redis non è attivo o può essere che i dati non siano presenti, recupero i dati dal DB (in seguito, se ne trovo uno, aggiungo gli stessi dati in Redis, se è necessario mantenere la coerenza.

0

CacheErrorHandler suggerito da Stephane Nicoll è utile. Ma non aiuta quando non riesce a creare la connessione ai redis.

Il metodo cache come @Cacheable non riesce con RedisConnectionFailureException.

0

Stavo cercando esattamente lo stesso, con lo stivale Spring, questo here ha funzionato per me.