我正在创建一个应用程序,其中有多个阶段 - 每个阶段的消息发送到我的队列中的亚马逊简单工作流程(SWF)...应用程序应该为每条收到的消息启动一个新的线程。java-如何不断等待事件发生
如何实现等待部分 - 以便应用程序不断扫描队列中的新消息并在收到消息时采取行动?
我正在创建一个应用程序,其中有多个阶段 - 每个阶段的消息发送到我的队列中的亚马逊简单工作流程(SWF)...应用程序应该为每条收到的消息启动一个新的线程。java-如何不断等待事件发生
如何实现等待部分 - 以便应用程序不断扫描队列中的新消息并在收到消息时采取行动?
您可以执行的一种方法是poll
queue
,直到您在while loop
机制中收到新消息为止。只要您收到新消息,就可以调用自己的操作。
你问被称为生产者 - 消费者模式什么 你可以读到它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();
}
}
我的应用程序是一个Web应用程序,它既是生产者又是消费者 - 您的答案仍适用于我的场景吗?谢谢...... – Arvind
绝对。它是适用于任何服务器 - 客户端场景的模型。消费者就是客户,它应该等待你机器上发生的事件(例如,另一部分代码执行内容++; available = true;) –
+1。我会让'contents'成为一个java.util.concurrent.ConcurrentLinkedQueue来处理一大堆消息,但是只有它按原样正常工作。 – RalphChapin
BlockingQueue
及其实施LinkedBlockingQueue
可以在这里很有用。
当Thread
将通过调用
queue.take()
和队列将是空想从队列take
的东西,这样的线程将等待,直到其他线程调用
queue.put(something).
也把东西放到队列如果队列已满,则queue.put()
将使线程等待,直到新元素的队列中将有空间。
轮询是一个相当丑陋的做法,IMO。如果应用程序不是经常忙碌(即:每次调查都没有收到消息),则阻止解决方案会更好。 – cHao
@cHao,虽然我承认它有一些缺点,但仍有很多应用程序仍然有效地使用轮询技术。 – UVM
@UnniVMana我的应用程序每秒可能会收到多达50个以上的邮件 - 轮询我的方案的一个很好的解决方案?是否有任何上限(即每秒接收到的最大消息数量)超过该上限,轮询不是有效/有用的?谢谢... – Arvind