2013-08-29 40 views
8

Używam metody PeekBatch(<messageCount>) na QueueClient (pakiet Windows Azure Service Bus 2.1.2.0).Blokada kolejki usługi Azure blokowania PeekBatch Azure?

To działa dobrze za pierwszym razem i zwraca moją pojedynczą wiadomość, która istnieje w mojej kolejce, ale kolejne wywołania nic nie zwracają. Po pięciu minutach połączenie ponownie odeśle wiadomość.

Pięć minut to maksymalny czas blokady na BrokeredMessage, więc zastanawiam się, czy PeekBatch rzeczywiście blokuje te wiadomości tak, jak robi to na odbierającym, mimo że podgląd nie powinien się blokować, o ile wiem.

Próbuję zbudować widok MVC, aby móc zobaczyć, co aktualnie siedzi w mojej kolejce, ale ten wchodzi w drogę. Czy ktoś może udzielić wskazówek na ten temat?

Aktualizacja: To tylko wydaje się dzieje, kiedy pamięć podręczna QueueClient przy użyciu właściwości statycznych. Jeśli za każdym razem utworzę świeżą QueueClient, PeekBatch działa zgodnie z oczekiwaniami. Wciąż nie mam pojęcia, dlaczego powoduje to ponowne użycie QueueClient. Microsoft seems to recommend reusing the QueueClient though, zamiast odtwarzać go za każdym razem, więc nadal jestem w tej sytuacji zagubiony.

Odpowiedz

13

Usługa QueueClient jest nieco pomocna. W metodach Peek (Peek i PeekBatch) możesz po prostu wywoływać je lub możesz podać konkretny numer sekwencji, aby pobrać określoną wiadomość po określonym numerze sekwencji. Jeśli po prostu zadzwonisz do Peek, lub w twoim przypadku PeekBatch, bez numeru sekwencyjnego, pobierze on pierwszą wiadomość lub wiadomości w kolejce. Po zwróceniu wiadomości QueueClient śledzi ostatni numer sekwencji, który został wyciągnięty. Każde kolejne wywołanie Peek spowoduje pobranie kolejnej wiadomości w kolejce. Chodzi o to, że "przeglądasz" wiadomości, a nie tylko interesujesz się pierwszą wiadomością w kolejce za każdym razem.

Tak więc, jeśli byłeś w pętli i byłeś wielokrotnie wywoływany, dopóki nie zwrócił wiadomości, przeoczyłbyś całą wiadomość w kolejce.

Ponieważ wywołujesz PeekBatch bez numeru sekwencyjnego, QueueClient pamięta ostatnio ustawiony zestaw, wtedy następne wywołanie będzie próbowało uzyskać następny zestaw po ostatniej wiadomości, którą przegląda. Dlatego po odtworzeniu QueueClient wydaje się, że resetuje. Powód, dla którego wydawał się resetować po 5 minutach wydaje się dziwny, ale może po prostu wyczyścić wartości przeglądania po pewnym punkcie związanym z operacją Timeout w kolejce. Do tego czasu numer porządkowy i tak byłby daleko, gdyby to była kolejka zajęta.

Jeśli naprawdę potrzebujesz tylko spojrzeć na pierwszą wiadomość, to zerknij tylko raz. Zwróci tylko pierwszą wiadomość. Jeśli za każdym razem musisz ciągnąć za pierwszą wiadomość, wykonaj Peek (0). Jeśli chcesz, aby pierwsze powiedziało 10 wiadomości za każdym razem, wywołaj PeekBatch (0, 10); to będzie jak powiedzenie: daj mi dziesięć pierwszych wiadomości o numerze kolejnym większym niż 0.

Wskazówki dotyczące ponownego użycia QueueClient są prawidłowe. Robi wszystkie rodzaje buforowania informacji i rzeczy. Nie chcesz odtwarzać go za każdym razem.

+0

Świetna odpowiedź! To działało dokładnie tak, jak opisałeś, a teraz żałuję, że nie próbowałem tego przeciążenia, które już minęło. :) Dokumenty MSDN powinny mieć trochę więcej informacji na temat metod podglądu. Może spróbuję dodać komentarz. – Michael

Powiązane problemy