質問

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

その後、常に<!> quot; listening <!> quot;である長時間実行されるアプリケーション(.NETで記述されたWindowsサービス)が必要です。キューに移動してメッセージを取得し、別のアプリケーション用に処理します。

ウェブ上でサンプルコードを見つけましたが、コードが安定しているかどうかについての入力を求めていました。 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コマンドを含む新しいスレッドをスピンオフするというアイデアは、無限ループの中でタイムアウトすることはありません。少し緊張します。

役に立ちましたか?

解決

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

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

サービスがシャットダウンするまで30秒あります。そうしないと、Windowsは停止したと見なします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top