13

現在、レガシー アプリケーションから更新されるデータベースがあります。SQL Service Broker キューを利用して、レコードが更新されたときにメッセージが (トリガーなどを使用して) キューに入れられるようにしたいと考えています。

次に、キューを常に「リッスン」してメッセージを取得し、別のアプリケーションのために処理する、長時間実行されるアプリケーション (.NET で記述された Windows サービス) が必要です。

Web でサンプル コードを見つけたので、そのコードがしっかりしているかどうかについて意見を求めました。したがって、これは 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
                    }
                }
            }
        }
    }
}

どう思いますか?コードは、私が望んでいたとおりに機能します。しかし、SQL コマンドを含む新しいスレッドをスピンオフするという考えは、無限ループ内でタイムアウトすることはありません。私は少し神経質になります。

4

1 に答える 1

7

無限ループに陥っている場合、サービスは正常にシャットダウンしません。サービスがシャットダウンメッセージを受け取ったときにオンに設定された終了条件を確認する必要があります。WAITFORにタイムアウトを追加して、シャットダウンする必要があるかどうかを確認できます。また、処理される各行でこれを確認する必要があります。

遅延のために2秒間のスリープを使用しましたが、WAITFORで2秒間のタイムアウトを実行すると、同じことが達成されます。

サービスのシャットダウンには30秒かかります。そうしないと、Windowsはサービスがスタックしていると見なします。

于 2009-01-20T18:58:16.060 に答える