Повторить подтверждение клиента Solace - PullRequest
0 голосов
/ 13 июня 2019

Я собираю решение Solace «точка-точка» в C #.

В моем подписчике / прослушивателе я использую режим ClientAck, чтобы обеспечить успешную обработку сообщений перед их удалением из очереди.

Мой вопрос (возможно, из-за моего ограниченного опыта в обмене сообщениями) касается неудачных сообщений, например, если я не могу обработать сообщение и, следовательно, не отправить Ack, как воспроизводится сообщение?

AnПример того, что у меня есть, выглядит следующим образом:

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();
        }       
    }
}

Итак, если я не подтверждаю, сообщение остается в очереди, как ожидалось (и требуется), однако, как (наилучшая практика) я могу повторно обработать его без ручного вмешательства?

1 Ответ

0 голосов
/ 13 июня 2019

После того, как сообщение было доставлено потребителю из очереди Solace PubSub +, сообщение будет отправлено повторно только в том случае, если клиент отсоединяется перед отправкой подтверждения обратно. Исключение из этого относится только к клиентам JMS с действием session.recover ().

Если сообщение необходимо повторно доставить приложению C # после того, как оно уже было отправлено, но не подтверждено, клиенту необходимо отсоединить и повторно привязать к очереди. Обратите внимание, что если к очереди также привязаны другие клиенты, сообщение может быть повторно отправлено этим клиентам, прежде чем ваш клиент выполнит повторную привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...