簡體   English   中英

從MSMQ中刪除了多封郵件

[英]Multiple messages removed from MSMQ

我有在WCF和MSMQ上運行的某些服務。 一切正常,但我們有此要求,即如果在處理一項作業期間發生意外情況,則不應影響其他任何作業。 該服務旨在增強功能,而且確實如此。 我們從未經歷過兩次運營崩潰,但是最近我們的客戶喜歡終止服務流程,並抱怨失去了一份以上的工作。

為了進行調查,我添加了一個計時器,該計時器每200ms跟蹤一次隊列的內容並發現意外情況。 處理請求時,WCF從隊列中刪除多個消息。 這是相關事件的smartinspec跟蹤(中心列中的數字是線程ID):

在此處輸入圖片說明

似乎總是在服務過程中的某處緩沖一條消息。 我一直在瀏覽WCF文檔,但未找到對此行為的任何參考。我可以做些什么來防止這種緩沖,或者您可以參考一些相關文章嗎?

這是服務類:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
 public class TheService : ITheService
 {
   private readonly ITraceFacade trace = TraceFactory.Resolve();//for tracing

   public ClientCodeWrapper clientCodeWrapper { get; set; }// a wrapper for libraries written by our client. it's instantiated and set in the OnStart method of the service host class

   public void ProcessJob(long jobId)
   {
      using (this.trace.ActivityScope(string.Format(CultureInfo.InvariantCulture, "The Service.ProcessJob({0})", jobId)))
       {        
         this.clientCodeWrapper.ProcessJob(jobId);        
       }
    }    
 }

這是我的服務配置

<system.serviceModel>
  <bindings>
    <netMsmqBinding>
      <binding name="MsmqBindingNonTransactionalNoSecurity" exactlyOnce="false">
        <security mode="None"/>
      </binding>
    </netMsmqBinding>
  </bindings>

  <services>
    <service name="TheService">
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8080/TheServiceIn"   />           
        </baseAddresses>
      </host>           
      <endpoint address="net.msmq://localhost/private/TheServiceIn"  
              binding="netMsmqBinding"
              bindingConfiguration="MsmqBindingNonTransactionalNoSecurity" 
              contract="ITheService">         
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>       

      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
  </services>
</system.serviceModel>

您所看到的似乎只是我的期望。 WCF確實可以讀取隊列中的多個消息以進行處理。 通常,這不是問題,對於事務隊列,這絕對不是問題(因為每個單獨的事務僅在消息處理完成后才提交,否則事務將中止並將消息返回到隊列中) 。

因此,基本上,您選擇不對消息進行處理,方法是通過禁用事務和使用非事務性隊列來避免丟失消息。 基本上,您告訴MSMQ和WCF,偶爾丟失消息是完全可以的。

考慮一下如果您的計算機(或MSMQservice)崩潰了會發生什么:您將不會失去一份工作; 您將丟失所有這些消息,因為消息將不會保留。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM