13

我目前有一个从旧应用程序更新的数据库。我想利用 SQL Service Broker 队列,以便在更新记录时将消息放入队列中(使用触发器或其他东西)。

然后,我想要一个长时间运行的应用程序(用 .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 命令的新线程的想法永远不会超时 - 在无限循环中 - 让我有点紧张。

4

1 回答 1

7

如果您处于无限循环中,您的服务将不会完全关闭。您应该检查退出条件,在服务收到关闭消息时设置。您可以向 WAITFOR 添加超时,以便检查是否应该关闭。您还应该在处理的每一行上检查这一点。

我使用了 2 秒的睡眠来延迟,但是在 WAITFOR 上执行 2 秒的超时会完成同样的事情。

服务有 30 秒的时间关闭,否则 Windows 会认为它卡住了。

于 2009-01-20T18:58:16.060 回答