std*_*bar 6 java multithreading amazon-sqs amazon-web-services
注意:这是来自此处的线程的重新发布。
大家好,我有一个处理单个SQS队列中的消息的过程。队列中可以包含许多消息,每条消息都会导致数据库命中。因此,我想将这个队列的读者作为线索。
每个线程的基本代码是:
public void run() {
while(true) {
ReceiveMessageRequest rmr = new ReceiveMessageRequest(queueUrl)
.withMaxNumberOfMessages(10)
.withWaitTimeSeconds(3);
List<Message> messages = sqsClient.receiveMessage(rmr).getMessages();
// process messages
// delete messages
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的是线程之间有大量重复的消息。我知道我应该在这里和那里看到一些重复,但是似乎每个线程都收到相同的消息集,实际上,只有一个线程可以完成很多工作。
我是误解了如何使用API还是做错了其他事情?Javadocs指出AmazonSQS类是线程安全的,实际上,即使为每个线程创建一个新的AmazonSQS类也没有改变。
任何指针将不胜感激。我当前的解决方案是从SQS队列中读取单个线程,将每个消息放入类似LinkedBlockingDeque的内容中,然后由工作人员读取。但是我觉得该实现不会像我希望的那样快耗尽队列。
由于每条消息都有一个数据库命中,因此处理每条消息似乎都需要时间。您应该增加队列的可见性超时。
来自 AWS SQS 文档:
消息收到后立即保留在队列中。为了防止其他使用者再次处理该消息,Amazon SQS 设置可见性超时,即 Amazon SQS 阻止其他使用组件接收和处理该消息的一段时间。
| 归档时间: |
|
| 查看次数: |
3535 次 |
| 最近记录: |