2013-08-29 62 views
8

Tôi đang sử dụng phương pháp PeekBatch(<messageCount>) trên QueueClient (Gói dịch vụ Windows Azure Gói dịch vụ 2.1.2.0).Hàng đợi dịch vụ Azure PeekBatch khóa?

Lần đầu tiên nó hoạt động tốt và trả lại thư duy nhất của tôi tồn tại trong hàng đợi của tôi, nhưng các cuộc gọi tiếp theo sẽ không trả lại gì. Sau năm phút, cuộc gọi sau đó sẽ trả lại tin nhắn.

Năm phút là thời gian khóa tối đa trên BrokeredMessage, vì vậy tôi tự hỏi nếu PeekBatch thực sự đang khóa các tin nhắn như trên nhận, mặc dù nhìn trộm không được khóa, theo như tôi biết.

Tôi đang cố gắng xây dựng chế độ xem MVC để có thể xem những gì đang thực sự nằm trong hàng đợi của tôi, nhưng điều này đang cản trở. Bất cứ ai có thể cung cấp bất kỳ hướng dẫn về điều này?

Cập nhật: Điều này dường như chỉ xảy ra khi tôi lưu bộ nhớ cache QueueClient bằng thuộc tính tĩnh. Nếu tôi thường xuyên tạo QueueClient mỗi lần, PeekBatch sẽ hoạt động như mong đợi. Tôi vẫn không biết tại sao lại sử dụng một số QueueClient. Microsoft seems to recommend reusing the QueueClient though, thay vì tạo lại nó mỗi lần, vì vậy tôi vẫn thua lỗ ở đây.

Trả lời

13

QueueClient đang được phần nào hữu ích. Trong các phương thức Peek (Peek và PeekBatch), bạn có thể chỉ cần gọi chúng, hoặc bạn có thể đưa ra một số thứ tự cụ thể để lấy một thông điệp cụ thể sau một số thứ tự nhất định. Nếu bạn chỉ cần gọi Peek, hoặc trong trường hợp của bạn PeekBatch, không có số thứ tự thì nó sẽ truy xuất thông điệp đầu tiên, hoặc các thông báo, trong hàng đợi. Khi thư được trả về, QueueClient theo dõi số thứ tự cuối cùng mà nó đã kéo. Mỗi cuộc gọi tiếp theo tới Peek sẽ tìm nạp thư tiếp theo trong hàng đợi. Ý tưởng là bạn đang "duyệt" các tin nhắn và không chỉ quan tâm đến tin nhắn đầu tiên trên hàng đợi mỗi lần.

Vì vậy, nếu bạn đang ở trong một vòng lặp và được gọi là peek liên tục cho đến khi nó không trả lại một thông báo về cơ bản bạn đã duyệt tất cả thư trong hàng đợi.

Vì bạn đang gọi PeekBatch không có số thứ tự QueueClient đang ghi nhớ tập cuối cùng, sau đó cuộc gọi tiếp theo sẽ thực sự cố gắng lấy tập tiếp theo sau thông điệp cuối cùng mà nó duyệt. Đây là lý do tại sao khi bạn tạo lại QueueClient, có vẻ như nó đã được thiết lập lại. Lý do nó dường như thiết lập lại sau 5 phút có vẻ lạ, nhưng có lẽ nó chỉ làm sạch các giá trị duyệt sau một số điểm được gắn với hoạt động Timeout trên hàng đợi. Bởi sau đó số thứ tự sẽ được khá xa anyway nếu nó là một hàng đợi bận rộn.

Nếu bạn chỉ cần thực sự nhìn vào thông điệp đầu tiên thì chỉ cần gọi peek một lần. Nó sẽ chỉ trả lại tin nhắn đầu tiên. Nếu bạn cần liên tục kéo tin nhắn đầu tiên mỗi lần thực hiện một Peek (0). Nếu bạn muốn lần đầu tiên nói 10 tin nhắn mỗi lần sau đó gọi PeekBatch (0, 10); sẽ giống như nói rằng hãy cho tôi mười thư đầu tiên có số thứ tự lớn hơn 0.

Hướng dẫn sử dụng lại QueueClient là âm thanh. Nó làm tất cả các loại bộ nhớ đệm của thông tin và mọi thứ. Bạn không muốn phải tạo lại nó mỗi lần.

+0

Câu trả lời hay! Điều này làm việc đúng như bạn đã mô tả, và bây giờ tôi ước rằng tôi đã thử quá tải mà đã vượt qua một số không. :) Các tài liệu MSDN nên có thêm một chút thông tin cho các phương pháp nhìn trộm. Có lẽ tôi sẽ cố gắng và thêm một bình luận ở đó. – Michael