2012-06-04 9 views
5

Ich erstelle eine Anwendung, in der es mehrere Stufen gibt - für jede Stufe wird eine Nachricht an meine Warteschlange in Amazon Simple Workflow (SWF) gesendet ... Die App sollte Starten Sie einen neuen Thread für jede Nachricht, die empfangen wird.java-wie man ständig auf ein Ereignis warten

Wie implementiere ich den wartenden Teil - so dass die Anwendung ständig die Warteschlange nach neuen Nachrichten durchsucht und Maßnahmen ergreift, sobald eine Nachricht empfangen wird?

Antwort

0

Eine Möglichkeit, die Sie tun können, ist poll die queue, bis Sie eine neue Nachricht in einer while loop mechanism.once Sie die neue Nachricht erhalten, können Sie Ihre eigene Aktion aufrufen.

+0

Polling ist eine ziemlich hässliche Art, dies zu tun, IMO. Eine Blockierungslösung wäre besser, wenn man davon ausgeht, dass die App nicht ständig beschäftigt ist (dh dass man bei jeder Umfrage keine Nachricht erhält). – cHao

+0

@cHao, es gibt viele Anwendungen immer noch effektiv Polling-Technik, obwohl ich zugeben, gibt es einige Nachteile darin. – UVM

+0

@UnniVMana meine Anwendung kann mehr als 50 Nachrichten pro Sekunde bekommen - ist eine gute Lösung für mein Szenario? Gibt es eine obere Grenze (d. H. Die maximale Anzahl von Nachrichten, die pro Sekunde empfangen werden), jenseits derer die Abfrage nicht effektiv/nützlich ist? Danke ... – Arvind

0

ein Serversocket Verwendung:

serversocket

insbesondere die .Accept() Methode wartet jemand eine Verbindung erfordern. Sie könnten dann einen neuen Thread instanziieren, indem Sie die Parameter übergeben, die zur Aufrechterhaltung der Verbindung benötigt werden (Adresse, Port usw.).

2

Was Sie fragen über einen Producer-Consumer-Modell genannt wird Sie es über here

Die Grundidee zu lesen: die Website ist ein Produzent ist und Sie als Kunde ein Verbraucher.

Sie warten(), bis der Hörer eine Nachricht empfangen und dann 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

Meine Anwendung ist eine Web-App - sie fungiert sowohl als Produzent als auch als Konsument - ist Ihre Antwort immer noch auf mein Szenario anwendbar? Danke ... – Arvind

+0

absolut. Es ist ein Modell, das für jedes Server-Client-Szenario anwendbar ist. Der Konsument ist der Client, er sollte auf ein Ereignis warten, das auf Ihrem Computer passiert (zum Beispiel, ein anderer Teil des Codes führt Inhalte ++; verfügbar = wahr;) –

+0

+1 für das Beispiel. Ich würde 'contents' eine java.util.concurrent.ConcurrentLinkedQueue erstellen, um eine Flut von Nachrichten zu behandeln, aber nur, wenn sie ordnungsgemäß funktioniert. – RalphChapin

2

BlockingQueue und deren Umsetzung LinkedBlockingQueue kann hier hilfreich sein.

Wenn Thread-take etwas aus der Warteschlange wollen durch

queue.take() 

und Warteschlange wird Aufruf leer, wird eine solche Thread, bis andere Thread wartet

queue.put(something). 

auch durch den Aufruf etwas in die Warteschlange gestellt Wenn die Warteschlange voll ist, wird queue.put() den putting-Thread warten lassen, bis Platz für neue Elemente in der Warteschlange ist.

Verwandte Themen