2011-07-11 10 views
8

Quiero almacenar en una cola, la estructura de datos no importa, solo los elementos que he insertado dicen los últimos 5 minutos de la hora actual. Cualquier cosa más antigua debe ser eliminada, de modo que cada vez que obtenga el tamaño de la cola dará la cuenta de los objetos insertados en los últimos 5 minutos.cola con elementos marcados con el tiempo dentro de un período de tiempo

Básicamente, todo lo que tengo que saber es cuántas veces mi aplicación ha realizado una llamada http a un servidor en los últimos 5 minutos antes de realizar la próxima llamada.

Si alguien sabe de alguna biblioteca existente que pueda tener esta implementación, por favor comparta.

+0

se le olvidó mencionar cosas como: plataforma/idioma/etc ... – DarkSquirrel42

+0

deseada sentimos su en Java. – user759326

Respuesta

4

¿En qué idioma? ¿La cola es persistente o está en la memoria?

Si necesita este comportamiento en Java, puede usar un DelayedQueue, y tener un hilo separado llamando al queue.take() continuamente en un ciclo cerrado para drenar los elementos caducados. queue.size() le dará el tamaño de los artículos restantes no vencidos en la cola. Esto requiere que los elementos que coloque en DelayedQueue implementen la interfaz Delayed y devuelva el valor de 5 minutos al método .getDelay().

+0

Gracias, pero el único problema con este enfoque es que el hilo deberá ejecutarse con bastante frecuencia para que el resultado sea el mejor para la llamada 'queue.size()'. – user759326

+0

sí, debe ser un ciclo cerrado (por ejemplo, mientras queue.take()! = Null). Tenga en cuenta que queue.take() se bloqueará hasta que la cola tenga elementos caducados. La frecuencia de la iteración se determina por la frecuencia con que se colocan los artículos en la cola (y, por lo tanto, la frecuencia con la que caducan), y no tanto por una recolección de basura basada en el tiempo (por lo que queue.size() será exactamente precisa en absoluto veces). –

+0

Gracias, no me di cuenta de que queue.take() bloqueará hasta que la cola tenga elementos caducados. Será interesante saber cómo implementaron DelayQueue: pueden usar dos colas internamente para contener los elementos caducados y otra para no caducar. De todos modos, muchas gracias, ustedes son tan serviciales. Tengo ganas de darles una tarjeta de regalo con una visa de $ 25. No estoy seguro de cómo enviar – user759326

6

Puede usar una cola de prioridad con marcas de tiempo como sus llaves. De modo que cuando llamas a Peek() siempre obtienes la marca de tiempo más antigua que aún está en la cola. Luego, cada vez que vaya a consultar el número de elementos dentro del tamaño de su ventana: limpie los elementos fuera de su ventana y devuelva el número de elementos que aún están en la cola de Prioridad.

Por ejemplo:

public class CountInWindow { 

    /** 
    * Adding a main just for testing 
    * @param args 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     System.out.println("test started"); 
     CountInWindow test = new CountInWindow(5000); //5 seconds for testing 
     test.debug = true; 
     test.insertTimeStamp(System.currentTimeMillis()); 
     Thread.sleep(100);//sleep 
     test.insertTimeStamp(System.currentTimeMillis()); 
     Thread.sleep(100);//sleep 
     test.insertTimeStamp(System.currentTimeMillis()); 
     Thread.sleep(100);//sleep 
     test.insertTimeStamp(System.currentTimeMillis()); 
     Thread.sleep(5040);//sleep 5 secs 
     test.insertTimeStamp(System.currentTimeMillis()); 
     Thread.sleep(100);//sleep 
     test.insertTimeStamp(System.currentTimeMillis()); 
     System.out.println(test.getWindowCount()); //Should be 2 not 6. 
     System.out.println("test done"); 
    } 

    java.util.PriorityQueue<Long> window; 
    public static final long FIVE_MINS_IN_MS = 300000l; 
    public final long WINDOW_SIZE; 
    public boolean debug = false; 

    //Constructor which defaults to 5mins 
    public CountInWindow(){ 
     WINDOW_SIZE = FIVE_MINS_IN_MS; 
     window = new java.util.PriorityQueue<Long>(); 
    } 
    //Constructor for any size window 
    public CountInWindow(long windowSize){ 
     WINDOW_SIZE = windowSize; 
     window = new java.util.PriorityQueue<Long>(); 
    } 
    /** 
    * Add a new timestamp to the window's queue 
    * @param ts 
    */ 
    public void insertTimeStamp(long ts){ 
     window.add(ts); 
    } 
    /** 
    * Clean up items outside the window size and then return the count of times still in the window. 
    * @return A count of timestamps still inside the 5 mins window. 
    */ 
    public int getWindowCount(){ 
     long currTime = System.currentTimeMillis(); 
     //Clean out old Timestamps 
     while((currTime - window.peek().longValue()) > WINDOW_SIZE){ 
      long drop = window.remove().longValue(); 
      if(debug)System.out.println("dropping item:" + drop); 
     } 
     return window.size(); 
    } 
} 
+0

La cola de prioridad es realmente necesaria en el escenario, ya que los elementos se insertan en la marca de tiempo y estarían en orden. ¿No bastaría solo una interfaz de cola con queue.peek()? – dmachop

Cuestiones relacionadas