2012-06-04 76 views
5

我正在创建一个应用程序,其中有多个阶段 - 每个阶段的消息发送到我的队列中的亚马逊简单工作流程(SWF)...应用程序应该为每条收到的消息启动一个新的线程。java-如何不断等待事件发生

如何实现等待部分 - 以便应用程序不断扫描队列中的新消息并在收到消息时采取行动?

回答

0

您可以执行的一种方法是pollqueue,直到您在while loop机制中收到新消息为止。只要您收到新消息,就可以调用自己的操作。

+0

轮询是一个相当丑陋的做法,IMO。如果应用程序不是经常忙碌(即:每次调查都没有收到消息),则阻止解决方案会更好。 – cHao

+0

@cHao,虽然我承认它有一些缺点,但仍有很多应用程序仍然有效地使用轮询技术。 – UVM

+0

@UnniVMana我的应用程序每秒可能会收到多达50个以上的邮件 - 轮询我的方案的一个很好的解决方案?是否有任何上限(即每秒接收到的最大消息数量)超过该上限,轮询不是有效/有用的?谢谢... – Arvind

0

使用一个ServerSocket:

serversocket

特别

的。接受()方法等待有人需要连接。然后你可以实例化一个新的线程,传递需要的参数来保持连接(地址,端口等)。

2

你问被称为生产者 - 消费者模式什么 你可以读到它here

的基本思想是:该网站是一个制片人,你是作为一个客户端消费者。

你等待(),直到听众收到一条消息,然后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

我的应用程序是一个Web应用程序,它既是生产者又是消费者 - 您的答案仍适用于我的场景吗?谢谢...... – Arvind

+0

绝对。它是适用于任何服务器 - 客户端场景的模型。消费者就是客户,它应该等待你机器上发生的事件(例如,另一部分代码执行内容++; available = true;) –

+0

+1。我会让'contents'成为一个java.util.concurrent.ConcurrentLinkedQueue来处理一大堆消息,但是只有它按原样正常工作。 – RalphChapin

2

BlockingQueue及其实施LinkedBlockingQueue可以在这里很有用。

Thread将通过调用

queue.take() 

和队列将是空想从队列take的东西,这样的线程将等待,直到其他线程调用

queue.put(something). 

也把东西放到队列如果队列已满,则queue.put()将使线程等待,直到新元素的队列中将有空间。