WCF MSMQ сообщение обработано несколько раз - PullRequest
0 голосов
/ 25 мая 2011

У меня есть программа WCF, с которой обмениваются данными через MSMQ. По некоторым причинам несколько сообщений обрабатываются несколько раз без видимой причины. Не выдается никаких ошибок, и я подтвердил, что приложение входит и выходит из операции Behaivior без каких-либо ошибок.

Например, я отправлю 1 сообщение через MSMQ, приложение получит его и успешно обработает, а затем по какой-то причине повторно обработает его (иногда несколько раз, иногда без обработки)

Вот соответствующие поведение и определяемые контракты:

[ServiceContract]
public interface IApp
{

    [OperationContract(IsOneWay = true)]
    void ProcessMessage(List<AppData> appInfo);

}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class ProcessInfo : IApp
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void ProcessMessage(List<AppData> appInfo)
    {
      try
      {
           app logic
      }
      catch(Exception e)
      {
      }



    }

Похоже, что сообщения MSMQ, которые обрабатываются несколько раз, имеют прерванный счет> 0 или помещаются в очередь повторов, однако я никогда не получаю сообщение об ошибке, почему это происходит.

Любая идея о том, почему это произойдет, будет высоко оценена.

1 Ответ

3 голосов
/ 26 мая 2011

Вы обнаружили, что ваша проблема заключается в превышении времени ожидания привязки, и спросили, почему вы не видите никаких исключений в коде вашего клиента или сервиса. Вот объяснение этому:

С точки зрения клиента, сообщение является односторонним и успешно доставлено в очередь. Это все, что имеет значение с точки зрения клиента. Клиент никогда не увидит, что при обработке сообщения на стороне сервера возникла исключительная ситуация.

С точки зрения обслуживания, вы не видели исключений в своем коде, потому что время ожидания обрабатывается на уровне времени выполнения WCF. Ваш код завершает свое выполнение нормально (WCF не собирается прерывать исполняющий поток или что-либо еще), но, что касается времени выполнения WCF, это заняло слишком много времени, и поэтому доставку сообщения необходимо повторить снова. При этом вы наверняка увидите ошибки в журнале событий и, если он включен, в журналах трассировки службы, указывающих на то, что истекло время ожидания.

...