Я собираю решение 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();
}
}
}
Итак, если я не подтверждаю, сообщение остается в очереди, как ожидалось (и требуется), однако, как (наилучшая практика) я могу повторно обработать его без ручного вмешательства?