2012-06-04 19 views
5

Estoy creando una aplicación en la que hay varias etapas: para cada etapa, se envía un mensaje a mi cola en Amazon Simple Work Flow (SWF) ... La aplicación debe comienza un nuevo hilo por cada mensaje que se recibe.java- cómo esperar constantemente para que ocurra un evento

¿Cómo implemento la parte de espera para que la aplicación escanee constantemente la cola de nuevos mensajes y tome medidas en el momento en que se recibe un mensaje?

Respuesta

0

Una forma de hacerlo es pollqueue hasta que aparezca un nuevo mensaje en un mecanismo while loop.una vez que reciba el nuevo mensaje, puede invocar su propia acción.

+0

El sondeo es una forma bastante fea de hacerlo, IMO. Una solución de bloqueo sería mejor, suponiendo que la aplicación no está constantemente ocupada (es decir, que no está recibiendo un mensaje en cada encuesta). – cHao

+0

@cHao, hay muchas aplicaciones que todavía usan la técnica de sondeo de manera efectiva, aunque admito que hay algunos inconvenientes. – UVM

+0

@UnniVMana mi aplicación puede recibir hasta más de 50 mensajes por segundo, ¿es una buena solución para mi escenario? ¿Hay algún límite superior (es decir, el número máximo de mensajes recibidos por segundo) más allá del cual el sondeo no es efectivo/útil? Gracias ... – Arvind

0

Utilice un ServerSocket:

serversocket

en particular, el método .Accept() espera a que alguien requiere una conexión. A continuación, podría instanciar un nuevo hilo pasando los parámetros necesarios para mantener la conexión (dirección, puerto, etc.).

2

Lo que sobre ASK se llama un modelo productor-consumidor se puede leer sobre ella here

La idea básica: el sitio es un productor y que eres como un cliente de un consumidor.

que esperar() hasta que el oyente reciba un mensaje y luego notifAll()

class WaitForAmazon{ 
    private boolean available = false; 
    private int contents; 

    public synchronized int consumer() { 
     while (available == false) { 
      try { 
       wait(); 
      } catch (InterruptedException e) { } 
     } 
     available = false; 
     notifyAll(); 
     return contents; 
    } 

    public synchronized void producer(int value) { 
     while (available == true) { 
      try { 
       wait(); 
      } catch (InterruptedException e) { } 
     } 
     contents = value; 
     available = true; 
     notifyAll(); 
    } 
} 
+0

mi aplicación es una aplicación web, actúa como productor y como consumidor, ¿sigue siendo aplicable su respuesta a mi caso? Gracias ... – Arvind

+0

absolutamente. es un modelo aplicable para cualquier escenario de servidor-cliente. el consumidor es el cliente, debe esperar un evento que ocurra en su máquina (por ejemplo, otra parte del código realiza contenidos ++; disponible = verdadero;) –

+0

+1 para el ejemplo. Me gustaría hacer 'contents' un java.util.concurrent.ConcurrentLinkedQueue para manejar un montón de mensajes, pero solo una vez está funcionando correctamente como está. – RalphChapin

2

BlockingQueue y su aplicación LinkedBlockingQueue puede ser útil aquí.

Cuando Thread querrán take algo de cola llamando

queue.take() 

y la cola estará vacía, como hilo esperará hasta que otro hilo va a poner algo en la cola llamando

queue.put(something). 

también si la cola está llena, queue.put() hará esperar hasta que haya espacio en la cola para nuevos elementos.

Cuestiones relacionadas