当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《SQLServiceBroker和.NETWindows服务-最佳实践?》经验,为你挑选了1个好方法。

我目前有一个从遗留应用程序更新的数据库.我想利用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> Darryl Braat..:

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

我已经使用了2秒的睡眠时间来延迟,但在WAITFOR上做2秒的超时会完成同样的事情.

服务有30秒关闭或Windows会认为它卡住了.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有