2012-10-31 70 views
4

我創建了一個WCF服務,該服務監聽專用MSMQ的作業。我扼殺了我的服務,以便它一次只能處理一個作業(maxConcurrentInstances = 1)。我遇到的問題是,當提交兩條消息並通過我的計算機管理控制檯檢查隊列時,它是空的。我希望有一個懸而未決的消息。當我提交三條消息時,我會在MSMQ中看到一條待處理消息。從閱讀MSDN看來,ServiceHost看起來像是將下一份作業保存在內存中,直到當前作業完成,但我無法找到一種方法將它關閉,以便它不會將消息保留在內存中。有誰知道一種方法可以使ServiceHost不會在內存中保留待處理消息並將其保留在隊列中?謝謝!WCF服務監聽器到MSMQ - 掛起的消息

<configuration> 
    <system.serviceModel> 
    <services> 
     <service 
      name="MyService" 
      behaviorConfiguration="DefaultServiceBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000/MyService/"/> 
      </baseAddresses> 
     </host> 
     <endpoint 
        address="net.msmq://localhost/private/MyService" 
        binding="netMsmqBinding" bindingConfiguration="MsmqBindingNoSecurity" 
        contract="IMyService" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceThrottling 
      maxConcurrentCalls="1" 
      maxConcurrentSessions="1" 
      maxConcurrentInstances="1" 
      /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <bindings> 
     <netMsmqBinding> 
     <binding name="MsmqBindingNoSecurity" 
      useActiveDirectory="false" 
      exactlyOnce="false"> 
      <security mode="None"> 
      <transport 
       msmqAuthenticationMode="None"/> 
      </security> 
     </binding> 
     </netMsmqBinding> 
    </bindings> 

    </system.serviceModel> 
</configuration> 
+0

這是我在計算器上的第一篇文章,所以我在這一個新手。讓我知道是否需要提供更多細節,或者我可以做些什麼來幫助社區回答我的問題。 – MrE

回答

0

我也注意到netMsmqBinding中的這種行爲,據我所知它不能從服務端尋址。

這只是一個問題,如果您沒有使用事務性隊列,而您的服務中的故障可能導致內存中的消息被永久刪除。

如果您使用事務隊列,即使消息已從入站隊列中讀取,它實際上仍在隊列中(但它變成「不可見」)。如果此時您的服務出現故障,則消息將重新排隊,然後在您恢復時進行處理。

如果你不能使用事務隊列,那麼你可以解決這個問題的唯一方法是從客戶端,這意味着檢查,看看消息是否撥打另一個電話之前已發送這麼做。這可以使用System.Messaging完成,或者我認爲你可以將它燒成自定義行爲。

0

如果您不能使用事務性隊列(例如,如果您使用的是netMessagingBinding),則可以使用ReceiveContext屬性進行更精細的控制。它深受朱瓦爾·洛在這裏他的書解釋說:

http://books.google.co.uk/books?id=PvNrurEhmiEC&pg=PA500&lpg=PA500&dq=ReceiveContext&source=bl&ots=ChDvHuH_Jq&sig=XHhiz2ebmXuu0QNYcBYhtlN99p4&hl=en&sa=X&ei=XgYmUo3kHOOH0AW--oHoCg&ved=0CFsQ6AEwCTgK#v=onepage&q=ReceiveContext&f=false

也看到這個MSDN文章,看看如何具體地可以在netMessagingBinding場景中使用(我知道這不是你的問題,但主要的直接相關仍持有)

http://msdn.microsoft.com/en-us/library/hh532034(VS.103).aspx