我现在有一个会从遗留应用程序更新的数据库。我想利用SQL服务代理队列以使得当记录被更新,消息被放置在队列中(使用触发器或东西)。

我然后像具有长的运行的应用(写在.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