0

我的程序在 SQS 队列中创建了一条消息,然后需要等待其中一名工作人员在队列上拉动工作来处理它。我想监视一条消息的状态以确定它何时被删除,因为那将是我工作完成的指标。但我想不出用 SQS API 做到这一点的方法。

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(id)”的正确方法是什么?

4

2 回答 2

0

另一种选择(但类似)是让消费者在响应队列中发布状态。等待必须异步完成(也许是未来)。

显然,由于交互的异步性质,处理中存在开销以及编程中的复杂性。但通常以这种方式完成。

于 2013-08-15T00:10:23.480 回答
0

恐怕这样的 API 端点不存在;查看 API 参考 ( http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Welcome.html ),您会发现没有查询消息的方法。

也许您可以尝试使用“更改消息可见性”,但是:

  • 有副作用
  • 您需要知道收到消息时获得的回执句柄

所以我想你最好的选择是将状态存储在一些外部数据库中(如果你想留在亚马逊土地,也许是 Dynamo?)。使用简单的消息 id -> 布尔映射指示消息是否已被处理。

于 2013-08-14T06:41:56.200 回答