.net WCF/MQSeries:如何保存有害消息

.net WCF/MQSeries:如何保存有害消息,.net,wcf,ibm-mq,.net,Wcf,Ibm Mq,我已经设置了一个WebSphereMQ合同。我已将队列配置为将重试5次的消息传递到单独的队列以进行毒药处理。我使用WebSphereMQV7.01提供的WCF通道与服务交互 虽然我的服务是连接的,但一切都很完美。一旦服务断开连接,毒药消息就会重新出现在主队列中。重新启动该服务会立即将消息从主队列放回中毒队列。在服务与队列断开连接后,我需要做什么才能使消息留在中毒队列中 代码当前处于POC模式,因此我在一个窗口上托管服务。该类具有以下属性: [ServiceBehavior(InstanceC

我已经设置了一个WebSphereMQ合同。我已将队列配置为将重试5次的消息传递到单独的队列以进行毒药处理。我使用WebSphereMQV7.01提供的WCF通道与服务交互

虽然我的服务是连接的,但一切都很完美。一旦服务断开连接,毒药消息就会重新出现在主队列中。重新启动该服务会立即将消息从主队列放回中毒队列。在服务与队列断开连接后,我需要做什么才能使消息留在中毒队列中

代码当前处于POC模式,因此我在一个窗口上托管服务。该类具有以下属性:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
  [AssuredDelivery()]
  public partial class MainWindow : Window, IWmqEndpoint
服务合约为:

  [ServiceContract()]
  public interface IWmqEndpoint
  {
    [OperationContract(IsOneWay = true)]
    void SendMessage(string message);

    [OperationContract(IsOneWay = true)]
    void SendComplex(PersonName name);
  }
主队列是持久的,否则为默认设置。毒药队列也是如此

队列设置:

  • 退出请求队列:wcf.inbound.poison
  • 退出阈值:5
  • 硬化后返回:未硬化
  • NPM等级:正常

  • 当应用程序读取工作单元内的消息时,WMQ不知道同一工作单元中是否有其他消息。如果该消息被证明是有害消息,WMQ会将其以与其他所有消息相同的工作单元重新加入回退队列。如果WMQ将消息移动到工作单元之外,则消息有可能丢失或复制。如果WMQ代表您提交UOW,则它有可能提交您检索到但未完全处理的消息。因此,如果执行回退处理,WMQ会使您在工作单元之间显式提交

    您看到的行为听起来像是消息被保存在同步点下的退出队列中。当应用程序关闭时,会出现隐式的
    退出
    ,所有消息都会返回到原始队列。您至少需要一个成功的工作单元才能使消息保留在回退队列中。尝试将一条好消息放在输入队列中坏消息的后面,然后执行显式的
    COMMIT


    顺便说一下,WebSphereMQ没有持久队列的概念。持久性是消息的一个属性。队列有一个属性
    DEFPSIST
    ,它告诉应用程序在首次创建消息时是否将消息持久化。消息在整个WMQ网络中传输时,其持久性不会改变,无论它通过的队列设置如何。因此,回退队列上的
    DEFPSIST
    没有任何效果,因为消息持久性是在到达回退队列之前定义的。

    当应用程序读取工作单元内的消息时,WMQ不知道同一工作单元中是否有任何其他消息。如果该消息被证明是有害消息,WMQ会将其以与其他所有消息相同的工作单元重新加入回退队列。如果WMQ将消息移动到工作单元之外,则消息有可能丢失或复制。如果WMQ代表您提交UOW,则它有可能提交您检索到但未完全处理的消息。因此,如果执行回退处理,WMQ会使您在工作单元之间显式提交

    您看到的行为听起来像是消息被保存在同步点下的退出队列中。当应用程序关闭时,会出现隐式的
    退出
    ,所有消息都会返回到原始队列。您至少需要一个成功的工作单元才能使消息保留在回退队列中。尝试将一条好消息放在输入队列中坏消息的后面,然后执行显式的
    COMMIT


    顺便说一下,WebSphereMQ没有持久队列的概念。持久性是消息的一个属性。队列有一个属性
    DEFPSIST
    ,它告诉应用程序在首次创建消息时是否将消息持久化。消息在整个WMQ网络中传输时,其持久性不会改变,无论它通过的队列设置如何。因此,回退队列上的
    DEFPSIST
    没有任何效果,因为消息持久性是在到达回退队列之前定义的。

    尝试将一条好消息放入队列,然后进行显式提交。那没用。请注意,此时,我正在强制不良行为评估在.NET中使用的有害消息处理模式。
    DIS QSTATUS(您的回退qname)所有这些消息都在回退队列中,并查看是否有正在进行的工作单元。如果是,将显示
    unco(是)
    。这些必须是未提交的消息,并且每个连接句柄只能有一个UOW。嗯……现在我考虑一下,也要执行
    disqstatus(您的回退qname)类型(句柄)ALL
    ,看看队列上是否连接了多个线程。尝试将一条好消息放入队列,然后执行显式提交。那没用。请注意,此时,我正在强制不良行为评估在.NET中使用的有害消息处理模式。
    DIS QSTATUS(您的回退qname)所有这些消息都在回退队列中,并查看是否有正在进行的工作单元。如果是,将显示
    unco(是)
    。这些必须是未提交的消息,并且每个连接句柄只能有一个UOW。嗯……现在我想一想,还要执行
    disqstatus(您的backout qname)类型(HANDLE)ALL
    ,看看是否有多个线程连接到队列。