Инструкция waitfor (получают * из очереди), не дожидаясь очереди, чтобы быть заполнены
я не знаю, как начать этот вопрос, но.
я работаю над модулем уведомления о заказе, где я хочу уведомить службу окон о поступлении нового заказа в базу данных,для этого я использую класс sqlnotificationrequest и зарегистрированный запрос (например, "select orderid from ordertable"), а также созданный прослушиватель, который будет ждать выполнения запроса "WAITFOR (RECEIVE * FROM ConditionalOrderChangedMessages)".
но этот запрос выполняется бесконечно долго.я не знаю, откуда эта очередь получает сообщение о том, что она выполняет "WAITFOR (RECEIVE * FROM ConditionalOrderChangedMessages)"
команда.
ниже приведен код для регистрации уведомления
private void RegisterSqlNotificationRequest() { if (request == null) { Guid guid = new Guid(); request = new SqlNotificationRequest(); request.UserData = "FWMarketDataEngine-" +serviceName + "-" + guid; request.Options = String.Format("Service={0};", serviceName); request.Timeout = notificationTimeout; } if (OnChanged != null) { OnChanged(this, null); } }
/// <summary> /// Monitoring the Service Broker queue. /// </summary> private void Listen() { try { using (SqlConnection conn = new SqlConnection(connectionString)) { using (cmd = new SqlCommand(listenSql, conn)) { if (conn.State != ConnectionState.Open) { conn.Open(); } cmd.CommandTimeout = notificationTimeout + 150; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //for (int i = 0; i <= reader.FieldCount - 1; i++) // Debug.WriteLine(reader[i].ToString()); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); isTimeout = true; } //fnCleanUp_Queue_Messages(); if (iResetCounter++ == MAX_RESET) { ReRegisterSqlNotification(); iResetCounter = 0; } else { RegisterSqlNotificationRequest(); } //Logger.Log("Monitoring the Service Broker queue."); }
private void fnGetSyncData() { if (conn == null) { conn = new SqlConnection(connectionString); } if (command == null) { command = new SqlCommand(GetSelectSQL(), conn); } if (dataToWatch == null) { dataToWatch = new DataSet(); } notification = null; notification = new SqlNotificationRequestRegister(GetListenerSQL(), serviceName, timeOut, connectionString); notification.OnChanged += NotificationOnChanged; FetchDataFromDatabase(); notification.StartSqlNotification(); }
поскольку "WAITFOR (RECEIVE" выполняется несколько раз ниже строки, также выполняется несколько раз и отправляется уведомление в службу окон.
using (SqlDataReader reader = cmd.ExecuteReader())
я новичок в SQL service broker framework, не знаю, что делать
Спасибо,
Что я уже пробовал:
уведомление sql