我目前有一个从遗留应用程序更新的数据库。我想利用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命令的新线程的想法永远不会超时 - 在无限循环内 - 让我有点紧张。
答案 0 :(得分:7)
如果您处于无限循环中,您的服务将不会干净地关闭。您应该检查退出条件,在服务获取关闭消息时设置。您可以向WAITFOR添加超时,以便检查是否应该关闭。您还应该在处理的每一行上检查这一点。
我已经使用了2秒的睡眠时间,但在WAITFOR上做了2秒的超时也会完成同样的事情。
服务有30秒关闭或Windows会认为它卡住了。