安慰客户确认重播

时间:2019-06-13 14:40:38

标签: solace

我正在用C#编写Solace点对点解决方案。

在我的订户/侦听器中,我正在使用ClientAck模式,以确保在从队列中删除消息之前已成功对其进行处理。

我的问题(可能是由于我在消息传递方面的经验有限)是关于失败的消息,例如如果我无法处理该消息并因此不发送Ack,如何重播该消息?

我所拥有的一个例子如下:

using (ISession session = context.CreateSession(sessionProperties, null, null))
{
    ReturnCode returnCode = session.Connect();
    if (returnCode == ReturnCode.SOLCLIENT_OK)
    {
        var endpointProps = new EndpointProperties()
        {
            Permission = EndpointProperties.EndpointPermission.Consume,
            AccessType = EndpointProperties.EndpointAccessType.Exclusive
        };

        using (IQueue queue = ContextFactory.Instance.CreateQueue(queueName))
        {
            session.Provision(queue, endpointProps,
            ProvisionFlag.IgnoreErrorIfEndpointAlreadyExists | ProvisionFlag.WaitForConfirm, null);

            _flow = session.CreateFlow(new FlowProperties { AckMode = MessageAckMode.ClientAck }, queue, null, HandleMessageEvent, HandleFlowEvent);
            _flow.Start();

            do { WaitEventWaitHandle.WaitOne(); } while (!cancellationToken.IsCancellationRequested);
        };

        return Task.CompletedTask;
    }
    else
    {
        throw new Exception($"Connection failed, return code: {returnCode}");
    }
}

然后处理传入的消息

void HandleMessageEvent(object sender, MessageEventArgs args)
{
    using (IMessage message = args.Message)
    {
        try
        {
            _handler(message.ApplicationMessageType, message.BinaryAttachment);
            _flow.Ack(message.ADMessageId);
        }
        finally 
        {
            WaitEventWaitHandle.Set();
        }       
    }
}

因此,如果我不确认,消息仍按预期(和要求)保留在队列中,但是,如何(最佳实践)在没有人工干预的情况下重新处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

从Solace PubSub +队列将消息传递给使用者后,如果客户端在发送回确认之前取消绑定,则将仅重新发送该消息。例外情况是特定于具有session.recover()操作的JMS客户端。

如果已经发送但未确认的消息需要重新发送到C#应用程序,则客户端将需要取消绑定并重新绑定到队列。请注意,如果还有其他客户端绑定到队列,则在您的客户端重新绑定之前,可能会将邮件重新发送给这些客户端。