4

ジョブのプライベート MSMQ をリッスンする WCF サービスを作成しました。一度に 1 つのジョブのみを処理するようにサービスを調整しました (maxConcurrentInstances = 1)。私が抱えている問題は、2 つのメッセージが送信され、コンピューター管理コンソールでキューを検査すると、キューが空になることです。保留中のメッセージが 1 つあるはずです。3 つのメッセージを送信すると、MSMQ に保留中のメッセージが 1 つ表示されます。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>
4

2 に答える 2

0

また、netMsmqBinding でこの動作に気付きました。私が知る限り、サービス側からはアドレス指定できません。

これは、トランザクション キューを使用していない場合にのみ問題となります。これにより、サービスで障害が発生すると、メモリ内メッセージが完全に削除される可能性があります。

メッセージがインバウンド キューから読み取られた場合でも、トランザクション キューを使用すると、メッセージは実際にはキューに残ります (ただし、「見えなくなります」)。この時点でサービスに障害が発生した場合、メッセージは再キューイングされ、復旧時に処理されます。

トランザクション キューイングを使用できない場合、これに対処できる唯一の方法は、クライアントから対処することです。つまり、別の呼び出しを行う前に、メッセージが送信されたかどうかを確認することを意味します。これは System.Messaging を使用して行うことができます。または、これをカスタム動作に焼き付けることができると思います。

于 2012-11-13T10:14:26.633 に答える