2012-07-25 14 views
5

La documentación Google Cache: Guayaba¿Cómo manejar las excepciones de actualización de Google Guava Cache?

Refrescante no es exactamente lo mismo que el desalojo. Como se especifica en LoadingCache.refresh (K), actualizar una clave carga un nuevo valor para la clave, posiblemente de forma asíncrona. El valor anterior (si lo hay) aún se devuelve mientras se actualiza la clave, a diferencia del desalojo, que obliga a las recuperaciones a esperar hasta que el valor se cargue de nuevo.

Si se produce una excepción mientras se actualiza, se guarda el valor anterior y se registra y se traga la excepción.

Esta tala y la deglución de excepciones es realmente malo en mi caso de uso, ya que significa que si una actualización lanza usuarios excepción de la caché seguirán encontrando los datos antiguos en la memoria caché.

¿Cómo puedo asegurarme de que si se lanza una excepción en la actualización, la memoria caché comienza a devolver un método de carga nulo o llamante?

Respuesta

7

Si no desea enviar los datos obsoletos, debe llamar al invalidate(key) en lugar de refresh(key). Esto descarta el valor en caché para key, si existe.

A continuación, una llamada posterior a get(key) será delegar de forma sincronizada con el valor del cargador, y volver a lanzar cualquier excepción lanzada por el CacheLoader, envuelto en una (Unchecked)ExecutionException.

1

Si los datos obsoletos son un problema para usted, entonces debe usar expireAfterWrite para asegurarse de que los datos obsoletos nunca se publiquen.

Cuestiones relacionadas