Solace 客户端确认回放

Solace Client Acknowledgement Replay

我正在用 C# 构建一个 Solace 点对点解决方案。

在我的 subscriber/listener 中,我使用 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();
        }       
    }
}

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

消息从 Solace PubSub+ 队列传递给消费者后,只有当客户端在发回确认之前取消绑定时,才会重新发送消息。例外情况特定于具有 session.recover() 操作的 JMS 客户端。

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