Lưu ý: đây là bản đăng lại của chuỗi từ here.Đọc từ hàng đợi SQS với nhiều chủ đề
Xin chào tất cả, Tôi có một quy trình xử lý thư trong một hàng đợi SQS. Hàng đợi có thể có nhiều thông báo trong đó và mỗi thông điệp dẫn đến một lần truy cập cơ sở dữ liệu. Vì vậy, tôi muốn tạo luồng cho các độc giả của hàng đợi này.
Các mã cơ bản cho mỗi thread là:
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
}
}
gì tôi nhìn thấy là có tấn điệp trùng lặp giữa các chủ đề. Tôi biết rằng tôi nên mong đợi một vài bản sao ở đây và ở đó, nhưng nó xuất hiện rằng mỗi thread được cùng một tập hợp các thông điệp và, thực tế, chỉ có một sợi bao giờ làm nhiều công việc.
Tôi có hiểu lầm về cách sử dụng API hoặc tôi đang làm điều gì khác sai? Các Javadocs chỉ ra rằng lớp AmazonSQS là luồng an toàn và, thực sự, thậm chí tạo ra một lớp AmazonSQS mới cho mỗi luồng không thay đổi gì cả.
Mọi con trỏ sẽ được đánh giá cao nhất. Suy nghĩ hiện tại của tôi về sửa chữa là có một chuỗi chỉ đọc từ hàng đợi SQS, đặt mỗi thông điệp vào một cái gì đó giống như một LinkedBlockingDeque và sau đó có các nhân viên đọc nó. Nhưng tôi cảm thấy rằng việc thực hiện đó sẽ không làm cạn kiệt hàng đợi nhanh như tôi muốn.
gì về nghe hàng đợi trong một chủ đề duy nhất, và sau đó quay lên chủ đề mới để xử lý mỗi tin nhắn bạn nhận được? –
@Mark B - Đó là một biến thể của những gì tôi đề xuất trong đoạn cuối của tôi - tôi đã hy vọng để tránh điều đó nhưng nó có thể là đặt cược tốt nhất. – stdunbar
Quá trình của bạn mất bao lâu? Bạn có thể cần phải sử dụng setVisibilityTimeout trên yêu cầu thông báo của bạn để cho quá trình xử lý và xóa các thông báo của bạn. – Larry