swapnil7090 Ответов: 0

Инструкция 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

0 Ответов