2013-08-14 2 views
0

Моя программа создает сообщение в очереди SQS, а затем должна ждать, пока один из рабочих потянет работу в очереди, чтобы обработать ее. Я хочу отслеживать статус сообщения, чтобы определить, когда он будет удален, поскольку это будет моим индикатором того, что работа выполнена. Но я не могу понять, как это сделать с помощью SQS API.После создания сообщения SQS, как я могу отслеживать, когда он удаляется?

SendMessageRequest msgRequest = new SendMessageRequest(SQS_QUEUE_URL, messageBody); 
SendMessageResult result = sqsClient.sendMessage(msgRequest); 

String msgId = result.getMessageId(); 

// so, in theory, this is what I WANT to do... 

while(!sqsClient.wasThisMessageDeletedYet(msgId)) 
    Thread.sleep(1000L); 

// continue, confident that because the message was deleted, I can rely upon the fact that the result of the Worker is now stashed where it's supposed to be 

Что такое правильный способ сделать "wasThisMessageDeletedYet (идентификатор)"?

ответ

0

Боюсь, что такой конечной точки API не существует; глядя на ссылку API (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Welcome.html), вы могли видеть, что нет методов для запроса сообщений.

Может быть, вы могли бы попробовать с «видимостью изменить сообщение», но:

  • имеет побочные эффекты
  • вы должны знать, как получение ручки, который вы получаете при получении сообщения

Итак, я полагаю, что лучше всего хранить это состояние в какой-то внешней базе данных (если вы хотите остаться на Амазонке, возможно, в Динамо?). С простым идентификатором id -> boolean message, указывающим, были ли обработаны сообщения или нет.

+0

Спасибо, я пытаюсь уйти от использования db, потому что количество подключений, необходимых для опроса, быстро выходит из-под контроля. Когда работник заканчивает свою работу, я думаю, что лучший способ для отправителя узнать об этом факте - это ... a) рабочие помещают готовые идентификаторы msg в memcached, b) отправители создают темы SNS для каждого msg и подписки; когда Работник делает свое дело, он помещает «сделанную» msg в тему SNS, затем отправитель удаляет тему. Но я не уверен, что накладные расходы на создание и уничтожение тем SNS для каждого сообщения. Любые другие идеи? – JeremyB

0

Другой вариант (но аналогичный) предназначен для того, чтобы потребитель опубликовал статус в очереди ответов. Ожидание должно выполняться асинхронно (возможно, будущее).

Очевидно, что из-за асинхронного характера взаимодействий возникают проблемы с обработкой, а также сложность программирования. Но обычно это делается именно так.