2012-10-31 72 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