Почему сообщения удаляются из очереди сообщений с помощью WCF и MSMQ? - PullRequest
0 голосов
/ 20 сентября 2019

Я занимаюсь разработкой службы WCF ( basicHttpBinding WS-привязка ) и ( NetMsmqBinding MSMQ )).Оба они размещены в отдельной службе Windows.Обе службы будут выполнять одинаковую работу, но имеют приоритет.т.е. служба HTTP имеет приоритет, который будет вызываться ( 1st Priority ), и если вызов этого метода на стороне клиента выдает сообщение об исключении (если служба HTTP не работает или не отвечает или выдает ошибку в методе), то же сообщениебудет обработан до конечной точки MSMQ ( 2nd Priority ).

В настоящее время конечные точки HTTP и MSMQ работают нормально.Но я хочу обработать то же сообщение в MSMQ, если оно выдает какую-то ошибку, а это сообщение должно остаться в той же очереди, но оно будет удалено из очереди.Как я могу преодолеть эту ситуацию.Это мой код, который у меня есть сейчас.Я что-то упустил?

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void ProcessToQueue(E.ProcessRequest processRequest, string QueueName)
    {
        try
        {
            //This is for testing purpose
            throw new Exception("Note: This is for testing if message remains in the queue");
            lock (lockObject)
            {
                MessageQueue messageQueue = new MessageQueue(QueueName);

                totalMessages = messageQueue.GetAllMessages();
                if (totalMessages.Length > 0)
                {
                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Total messages remaining in queue ", QueueName, " : ", totalMessages.Length), LogType.Default);
                }                    
                if (processRequest != null && processRequest.AlertId != 1 && processRequest.Key != "Testing")
                {
                    E.ProcessToQueue processToQueue = FillProcessQueue(processRequest);
                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Upload process started..."), LogType.Default);

                    Stopwatch stopwatch = Stopwatch.StartNew();

                    //Process to S3 server
                    E.UploadFileResponse response = M.MessageProcessor.ProcessToS3Server(processToQueue);
                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> File uploaded to server with ID >> ", processRequest.AlertId, " - success ", response.Success), LogType.Default);

                    stopwatch.Stop();

                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Time Consumed in ProcessToS3Server >> ", stopwatch.Elapsed.TotalMilliseconds, " - success ", response.Success), LogType.Default);

                    stopwatch.Reset();
                    stopwatch = Stopwatch.StartNew();
                    //Update in Database
                    Task<long> updateId = M.MessageProcessor.UpdateProcessedData(processToQueue, response);
                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Alert ID >> ", processRequest.AlertId, "\nKey >> ", processRequest.Key, "\nLink >>", response.PreSignedURL), LogType.Default);

                    stopwatch.Stop();

                    Logger.Logger.Instance.WriteEventLog(string.Concat("AlertFileUploadService.Queue >> Time Consumed in UpdateProcessedData >> ", stopwatch.Elapsed.TotalMilliseconds, " - success ", response.Success), LogType.Default);
                }
            }
        }
        catch (Exception ex)
        {
            Logger.Logger.Instance.WriteExceptionLog(string.Concat("AlertFileUploadService.Queue >> ", ex.Message), LogType.Default, ex);
            throw ex;
        }
    }

Примечание : выбросить новое исключение («Примечание: это для проверки, остается ли сообщение в очереди»);Кроме того, я пробовал выше ProcessToQueue сообщение с транзакцией со стороны клиента, но без усиления.

, и это моя конфигурация.

<system.serviceModel>
<services>
  <!--Alert FileUploader(Queue) Service Start-->
  <service name="AlertFileUploadService.Queue.QueueService">
    <endpoint address="net.msmq://localhost/private/FileUpload"
              binding="netMsmqBinding"
              contract="AlertFileUploadService.IQueueService">
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:5813/FileUploadToMSMQ"/>
      </baseAddresses>
    </host>
  </service>
  <!--Alert FileUploader(Queue) Service End-->
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <netMsmqBinding>
    <binding>
      <security mode="None"></security>
    </binding>
  </netMsmqBinding>
</bindings>

Вот так я получаю звонок из клиентского приложения.

queueProxyService = new QueueServiceClient();
string queueName = string.Concat(".\\Private$\\", AppConfigs.QueueInstanceName);
queueProxyService = new QueueServiceClient();
queueProxyService.ProcessToQueue(new QueueService.ProcessRequest()
{
  AlertId = result.AlertId,
  ImageBytes = req.ImageBytes,
  Key = RequestId,
  Link = ""
}, queueName);
...