¿Cómo vaciar el caché de guayaba cada 30 segundos mientras lo envío a otro método?

Estoy poblando mi caché de guayaba desde múltiples hilos llamandoadd método. Ahora desde el hilo de fondo que se ejecuta cada 30 segundos, quiero enviar lo que esté en el caché asendToDB método atómicamente?

Abajo está mi código:

public class Example {
  private final ScheduledExecutorService executorService = Executors
      .newSingleThreadScheduledExecutor();
  private final Cache<Integer, List<Process>> cache = CacheBuilder.newBuilder().maximumSize(100000)
      .removalListener(RemovalListeners.asynchronous(new CustomRemovalListener(), executorService))
      .build();

  private static class Holder {
    private static final Example INSTANCE = new Example();
  }

  public static Example getInstance() {
    return Holder.INSTANCE;
  }

  private Example() {
    executorService.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {
        // is this the right way to send cache map?
        sendToDB(cache.asMap());
      }
    }, 0, 30, SECONDS);
  }

  // this method will be called from multiple threads
  public void add(final int id, final Process process) {
    // add id and process into cache
  }

  // this will only be called from single background thread
  private void sendToDB(ConcurrentMap<Integer, List<Process>> holder) {
    // use holder here

  }
}

¿Es esta la forma correcta de enviarcache mapa a misendToDB ¿método? Básicamente quiero enviar todas las entradas que están allí en el caché durante esos 30 segundos y vaciar el caché. Después de eso, mi caché se volverá a llenar en los próximos 30 segundos y luego ¿haré el mismo proceso?

Creo que usandocache.asMap() podría no ser la forma correcta ya que no vacía el caché, por lo que reflejará todos los cambios que ocurren en el caché en misendToDB método también?

Respuestas a la pregunta(1)

Su respuesta a la pregunta