2012-07-22 22 views
6

Próbuję stworzyć usługę WCF, która zajmuje się setkami pobrań i konwersji. Zainicjowałem MSMQ z kolejką transakcji, która odbiera wiadomości z aplikacji internetowej ASP.NET.WCF & MSMQ & TransactionScope long process

Moje pytanie po długich badaniach w internecie jest jak zarządzać długi proces w metodzie usług WCF, które zarządzają wiadomości MSMQ.

Problem polega na tym, że po pobraniu z małym rozmiarem proces kończy się wkrótce, a zakres powraca do usługi MSMQ, ale jeśli rozmiar pobierania jest duży i potrzeba 3/4 minuty do pobrania, to nadal zwracany jest zakres kompletne, ale usługa MSMQ ponownie wysyła MSG do usługi WCF i mam zduplikowane pobrania.

myślę, że jest to problem limitu czasu, ale ja już próbował lepiej config mój gospodarz app.config bez powodzenia.

 <netMsmqBinding> 
    <binding name="OrderServiceMsmqBinding" 
      maxRetryCycles="1" 
      receiveRetryCount="1" 
      retryCycleDelay="00:05:20" 
      deadLetterQueue="System" 
      receiveErrorHandling="Move" 
      exactlyOnce="true" 
      durable="true" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:20:00" 
      timeToLive="1.00:00:00" useMsmqTracing="true"> 
     <security mode="None"></security> 
    </binding> 
    </netMsmqBinding> 

i jest to metoda do usług WCF:

<OperationBehavior(TransactionScopeRequired:=True, TransactionAutoComplete:=True)> _ 
Public Sub FfmpegConversion(ffmpegjob As FfmpegJob) Implements IOrderService.FfmpegConversion 
    Using sc As New TransactionScope(TransactionScopeOption.Required) 
     Try 
      ExecuteLongProcess() 
     Catch ex As Exception 
      Console.WriteLine(ex.Message) 
     Finally 
      sc.Complete() 
     End Try 
    End Using 
End Sub 

UPDATE

Po długich prób i badań, zaczynam myśleć, że jest niemożliwe, aby na długi proces metoda uruchamiana przez kwerendę MSMQ.

Obejmuję go przy użyciu innego wątku, który zarządza danymi, ale teraz problem polega na tym, że tracę perspektywę TransactionScope, ponieważ po przejściu zadania do nowego wątku, MSMQ usuwa komunikat, jak się uważa.

+1

Czy próbowałeś co 'receiveRetryCount = 0'? –

Odpowiedz