Saltar al contenido

Usando múltiples implementaciones de caché con Spring Cache

Solución:

¿Qué implementación se necesita según el nombre de la caché?

No se basa en el nombre de la caché, pero sí, en función del CacheManager es posible. Declare uno de ellos como @Primary CacheManager, como sigue:

@Configuration
@EnableCaching
@PropertySource(value = { "classpath:/cache.properties" })
public class CacheConfig {

    @Bean
    @Primary
    public CacheManager hazelcastCacheManager() {
        ClientConfig config = new ClientConfig();
        HazelcastInstance client = HazelcastClient.newHazelcastClient(config);
        return new HazelcastCacheManager(client);
    }

    @Bean
    public CacheManager guavaCacheManager() {
         GuavaCacheManager cacheManager = new GuavaCacheManager("mycache");
           CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder()
           .maximumSize(100)
           .expireAfterWrite(10, TimeUnit.MINUTES);
           cacheManager.setCacheBuilder(cacheBuilder);
           return cacheManager;
    }

}

y especificarlo a nivel de clase como:

@Service
@CacheConfig(cacheManager="hazelcastCacheManager")
public class EmployeeServiceImpl implements IEmployeeService {

}

o a nivel de método como:

@Service
public class EmployeeServiceImpl implements IEmployeeService {

    @Override
    @Cacheable(value = "EMPLOYEE_", key = "#id", cacheManager= "guavaCacheManager")
    public Employee getEmployee(int id) {
        return new Employee(id, "A");
    }

}

Si tiene que ceñirse solo al nombre de Cache, entonces puede usar CacheManager.

Tienes 2 opciones.

Uno es como mencionó @Arpit: Defina múltiples CacheManagers y especifíquelos en anotaciones a nivel de método (@Cacheable, @CachePut, etc.) o anotaciones a nivel de clase (@CacheConfig)

También puede crear anotaciones personalizadas:

@CacheConfig(cacheManager = "guavaCacheManager")
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GuavaCacheable {
}

@GuavaCacheable
@Service
public class MyServiceImpl implements MyService {
}

Y como segunda opción, puede crear un solucionador de caché personalizado si sus necesidades de almacenamiento en caché son complejas.

Puede buscar aquí un CacheResolver personalizado que administre múltiples CacheManagers y admita habilitar / deshabilitar. Pero para la mayoría de los casos, CacheResolver es excesivo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *