SQL Service Broker和.NET Windows Service - 最佳实践?

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 命令的新线程,永远不会超时,这让我有点紧张。

1个回答

7
您的服务如果进入无限循环,则不能正常关闭。您应该检查是否已设置关闭消息的退出条件。 您可以向WAITFOR添加超时,以便您可以检查是否应该关闭。您还应该在处理每行时检查此项。
我已经使用2秒的延迟,但是在WAITFOR上进行2秒超时将实现相同的功能。
服务有30秒钟来关闭,否则Windows将认为它被卡住了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接