TsgcWebSocketHTTPServer › Właściwości › QueueOptions

QueueOptions Właściwość

Serializuje wychodzące wiadomości przez wewnętrzną kolejkę per-połączenie, zapobiegając rywalizacji między wątkami.

Składnia

property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;

Wartość domyślna

Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, DrainedMode=qdmTransition

Uwagi

Po włączeniu wiadomości są umieszczane w wewnętrznej kolejce i wysyłane w kontekście wątku połączenia zamiast wątku wywołującego, co eliminuje konieczność blokowania potrzebnego, gdy kilka wątków zapisuje do tego samego połączenia jednocześnie. Każdy typ wiadomości (Text, Binary, Ping) jest podobiektem z własną właściwością Level, która nadaje niezależny priorytet: qmNone pomija kolejkę (domyślnie), qmLevel0 jest przetwarzany jako pierwszy, następnie qmLevel1, a na końcu qmLevel2. Na przykład ustawienie Text.Level i Binary.Level na qmLevel2, a Ping.Level na qmLevel1 gwarantuje, że pingi są dostarczane przed zwykłym ruchem. QueueOptions jest obsługiwane wyłącznie przez domyślny IOHandler. Gdy IOHandlerOptions.IOHandlerType ma wartość iohIOCP lub iohEPOLL, kolejka jest wyłączana w chwili uruchomienia serwera: trzy poziomy są resetowane do qmNone, zdarzenie OnError zgłasza ten fakt, a wiadomości są zapisywane bezpośrednio w wątku wywołującym. Poziom przypisany, gdy serwer już nasłuchuje, jest resetowany w ten sam sposób przy każdym nowym połączeniu.

DrainedMode określa, kiedy jest wywoływane zdarzenie OnQueueDrained. Przy qdmTransition (domyślnie) zdarzenie jest wywoływane raz za każdym razem, gdy kolejka wychodząca połączenia przechodzi ze stanu zawierającego wiadomości do pustego. Przy qdmEveryPass jest wywoływane w każdym przebiegu pętli połączenia, zaraz po wysłaniu kolejek, nawet gdy kolejka była już pusta oraz nawet gdy Text.Level, Binary.Level i Ping.Level mają wartość qmNone, więc nie jest potrzebny sztuczny poziom kolejki. Jest to przydatne jako haczyk dla poszczególnych połączeń, wykonywany we własnym wątku połączenia, na przykład do wysyłania oczekujących danych aplikacji za pomocą WriteData. Zdarzenie nie podlega ustawieniu NotifyEvents, więc procedura obsługi musi być szybka i nie może dotykać interfejsu użytkownika. Tę pętlę ma wyłącznie domyślny IOHandler, przy iohIOCP i iohEPOLL zdarzenie nigdy nie jest wywoływane w każdym przebiegu. Każde połączenie kopiuje opcje kolejki w chwili nawiązania, więc ustaw DrainedMode przed aktywacją komponentu, połączenia już otwarte zachowują poprzedni tryb.

Przykład


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;

Wróć do Właściwości