SQL服务代理和.NET Windows服务 - 最佳做法?
-
19-08-2019 - |
题
我现在有一个会从遗留应用程序更新的数据库。我想利用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将考虑它卡住。
不隶属于 StackOverflow