Msmq4SubqueuePoisonHandler.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System.Runtime;
  7. using System.ServiceModel.Diagnostics.Application;
  8. sealed class Msmq4SubqueuePoisonHandler : IPoisonHandlingStrategy
  9. {
  10. MsmqReceiveHelper receiver;
  11. public Msmq4SubqueuePoisonHandler(MsmqReceiveHelper receiver)
  12. {
  13. this.receiver = receiver;
  14. }
  15. public void Open()
  16. { }
  17. public bool CheckAndHandlePoisonMessage(MsmqMessageProperty messageProperty)
  18. {
  19. if (messageProperty.AbortCount > this.receiver.MsmqReceiveParameters.ReceiveRetryCount)
  20. {
  21. if (TD.ReceiveRetryCountReachedIsEnabled())
  22. {
  23. TD.ReceiveRetryCountReached(messageProperty.MessageId);
  24. }
  25. FinalDisposition(messageProperty);
  26. return true;
  27. }
  28. else
  29. {
  30. return false;
  31. }
  32. }
  33. public void FinalDisposition(MsmqMessageProperty messageProperty)
  34. {
  35. switch (this.receiver.MsmqReceiveParameters.ReceiveErrorHandling)
  36. {
  37. case ReceiveErrorHandling.Drop:
  38. this.receiver.DropOrRejectReceivedMessage(messageProperty, false);
  39. break;
  40. case ReceiveErrorHandling.Fault:
  41. MsmqReceiveHelper.TryAbortTransactionCurrent();
  42. if (null != this.receiver.ChannelListener)
  43. this.receiver.ChannelListener.FaultListener();
  44. if (null != this.receiver.Channel)
  45. this.receiver.Channel.FaultChannel();
  46. break;
  47. case ReceiveErrorHandling.Reject:
  48. this.receiver.DropOrRejectReceivedMessage(messageProperty, true);
  49. MsmqDiagnostics.PoisonMessageRejected(messageProperty.MessageId, this.receiver.InstanceId);
  50. break;
  51. default:
  52. Fx.Assert("System.ServiceModel.Channels.Msmq4PoisonHandler.FinalDisposition(): (unexpected ReceiveErrorHandling)");
  53. break;
  54. }
  55. }
  56. public void Dispose()
  57. { }
  58. }
  59. }