2012-06-04 2 views
5

Я создаю приложение, в котором есть несколько этапов. Для каждого этапа сообщение отправляется в мою очередь в Amazon Simple Work Flow (SWF) ... Приложение должно запустите новый поток для каждого полученного сообщения.java- как долго ждать события.

Как реализовать ожидающую часть - чтобы приложение постоянно просматривало очередь для новых сообщений и предпринимало действия в момент получения сообщения?

ответ

0

Один способ, которым вы можете сделать это: pollqueue, пока не получите новое сообщение в while loop mechan.once, вы получите новое сообщение, вы можете вызвать свое собственное действие.

+0

Опрос - довольно уродливый способ сделать это, ИМО. Блокирующее решение будет лучше, если приложение не будет постоянно занято (т. Е. Что вы не получаете сообщение с каждым опросом). – 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

мое приложение является веб-приложением, которое действует как производитель и потребитель, а ваш ответ по-прежнему применим к моему сценарию? Спасибо ... – Arvind

+0

совершенно. это модель, применимая для любого сценария сервера-клиента. клиент является клиентом, он должен дождаться события, которое происходит на вашем компьютере (например, другая часть кода выполняет содержимое ++; available = true;) –

+0

+1 для примера. Я бы сделал 'contents' java.util.concurrent.ConcurrentLinkedQueue, чтобы обрабатывать потоки сообщений, но только после того, как он работает правильно, как есть. – RalphChapin

2

BlockingQueue и ее реализация LinkedBlockingQueue может быть полезным здесь.

Когда Thread захочет take что-то из очереди по телефону

queue.take() 

и очередь будет пустой, такой поток не будет ждать, пока другой поток будет положить что-то в очереди, вызвав

queue.put(something). 

Рекомендуем также если очередь заполнена, queue.put() заставит поток ждать до тех пор, пока не появится место в очереди для новых элементов.

Смежные вопросы