2012-06-04 12 views
5

Sto creando un'applicazione in cui ci sono più stadi - per ogni fase un messaggio viene inviato alla mia coda in Amazon Simple Work Flow (SWF) ... L'app dovrebbe inizia una nuova discussione per ogni messaggio ricevuto.java- come aspettare costantemente che un evento avvenga

Come si implementa la parte in attesa, in modo che l'applicazione esegua costantemente la scansione della coda per i nuovi messaggi e agisca nel momento in cui viene ricevuto un messaggio?

risposta

0

Un modo si può fare è poll il queue fino ad ottenere un nuovo messaggio al while loop mechanism.once si ottiene il nuovo messaggio, si può invocare la propria azione.

+0

Polling è un modo piuttosto brutto di farlo, IMO. Una soluzione di blocco sarebbe meglio, supponendo che l'app non sia costantemente occupata (ad esempio: che non stai ricevendo un messaggio con ogni sondaggio). – cHao

+0

@cHao, ci sono molte applicazioni che usano ancora la tecnica del polling in modo efficace anche se ammetto che ci sono alcuni inconvenienti. – UVM

+0

@UnniVMana la mia applicazione può ricevere fino a 50+ messaggi al secondo - sta interrogando una buona soluzione per il mio scenario? Esiste un limite massimo (cioè il numero massimo di messaggi ricevuti al secondo) oltre il quale il polling non è efficace/utile? Grazie ... – Arvind

0

Utilizzare un ServerSocket:

serversocket

in particolare, il metodo Accetti() attende che l'utente richiede una connessione. È quindi possibile creare un'istanza di un nuovo thread passando i parametri necessari per mantenere la connessione (indirizzo, porta, ecc.).

2

ciò che si chiede circa si chiama un modello produttore-consumatore si può leggere su di esso here

L'idea di base: il sito è un produttore e tu sei come un client consumatore.

si attende() fino a quando l'ascoltatore riceve un messaggio e poi 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

la mia applicazione è un'app Web che funge sia da produttore che da consumatore - la tua risposta è ancora applicabile al mio scenario? Grazie ... – Arvind

+0

assolutamente. è un modello applicabile a qualsiasi scenario server-client. il consumatore è il client, dovrebbe aspettare un evento che si verifica sulla tua macchina (ad esempio, un'altra parte del codice esegue i contenuti ++; available = true;) –

+0

+1 per l'esempio. Vorrei rendere 'contents' un java.util.concurrent.ConcurrentLinkedQueue per gestire un flusso di messaggi, ma solo una volta che funziona correttamente come è. – RalphChapin

2

BlockingQueue e la sua attuazione LinkedBlockingQueue può essere utile qui.

Quando Thread vorranno take qualcosa dalla coda chiamando

queue.take() 

e coda sarà vuota, come filo attenderà altro thread metterà qualcosa in coda chiamando

queue.put(something). 

anche se la coda è piena, queue.put() farà mettere il thread in attesa fino a quando non ci sarà spazio in coda per i nuovi elementi.

Problemi correlati