2009-01-20 12 views
12

Mam obecnie bazę danych, która jest aktualizowana ze starszej aplikacji. Chciałbym użyć kolejki SQL Service Broker, aby po aktualizacji rekordu komunikat był umieszczany w kolejce (przy użyciu wyzwalacza lub czegoś podobnego).Usługa SQL Service Broker i .NET Windows Service - najlepsze praktyki?

Chciałbym wtedy mieć długo działającą aplikację (usługę Windows napisaną w .NET), która ciągle "nasłuchuje" kolejki, aby pobrać wiadomości i przetworzyć je dla innej aplikacji.

Znalazłem przykładowy kod w sieci i chciałem tylko uzyskać pewne informacje, czy kod jest solidny, czy nie. Oto skrócona wersja klasy usługi Windows:

public class MyService 
{ 
    public void StartService() 
    { 
     Thread listener = new Thread(Listen); 
     listener.IsBackground = true; 
     listener.Start(); 
    } 

    private void Listen() 
    { 
     while (true) 
     { 
      using (SqlConnection connection = new SqlConnection(_connectionString)) 
      { 
       string commandText = "WAITFOR (RECEIVE * FROM MyQueue);"; 
       using (SqlCommand command = new SqlCommand(commandText, connection)) 
       { 
        connection.Open(); 
        command.CommandTimeout = 0; 
        SqlDataReader reader = command.ExecuteReader(); 
        while (reader.Read()) 
        { 
         // Process message 
        } 
       } 
      } 
     } 
    } 
} 

Co sądzisz? Kod działa dokładnie tak, jak tego chcę. Ale pomysł wyrzucenia nowego wątku zawierającego polecenie SQL nigdy się nie skończy - w nieskończonej pętli - trochę mnie to denerwuje.

Odpowiedz

7

Twoje usługi nie zostaną zamknięte w czysty sposób, jeśli jesteś w nieskończonej pętli. Powinieneś sprawdzić stan wyjścia, ustawiony, gdy usługa otrzyma komunikat o zamknięciu. Możesz dodać limit czasu do WAITFOR, abyś mógł sprawdzić, czy nie chcesz się wyłączać. Powinieneś również sprawdzić to w każdym przetwarzanym wierszu.

Skorzystałem z 2 sekundowego spania dla opóźnienia, ale wykonanie 2-sekundowego limitu czasu na WAITFOR przyniosłoby to samo.

Usługa ma 30 sekund na wyłączenie lub system Windows uzna ją za zablokowaną.

Powiązane problemy