WCF服务侦听器到MSMQ - 待处理的消息

4
我创建了一个监听私有MSMQ作业的WCF服务。我将服务限制为一次只处理一个作业(maxConcurrentInstances = 1)。我的问题是,当提交两条消息时,通过计算机管理控制台检查队列时,它是空的。我期望会有一条待处理的消息。当我提交三条消息时,我会在MSMQ中看到一条待处理的消息。从阅读MSDN来看,ServiceHost正在将下一个作业保存在内存中,直到当前作业完成,但我找不到关闭它以便不再将消息保存在内存中的方法。是否有人知道如何使ServiceHost不会将待处理的消息保存在内存中,而是将其留在队列中?谢谢!
  <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>

这是我在StackOverflow上的第一篇帖子,所以我对此还很新手。如果需要提供更多细节或者有其他可以帮助社区回答我的问题的方法,请告诉我。 - MrE
2个回答

0

如果你不能使用事务队列(例如如果你正在使用netMessagingBinding),你可以使用ReceiveContext属性来获得更精细的控制。Juval Lowy在他的书中对此进行了很好的解释:

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


0

我也注意到了netMsmqBinding中的这种行为,据我所知,它无法从服务端解决。

只有在您不使用事务队列的情况下才会出现问题,因为服务故障可能导致内存中的消息永久丢失。

如果您使用事务队列,即使消息已经从入站队列中读取,它实际上仍然存在于队列中(但变得“不可见”)。如果此时您的服务发生故障,消息将重新排队,然后在您恢复时进行处理。

如果您无法使用事务队列,则唯一的解决方法是从客户端进行,这意味着在进行另一个调用之前检查是否已传输消息。可以使用System.Messaging来完成此操作,或者我认为您可以将其嵌入自定义行为中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接