我正在用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>
答案 0 :(得分:0)
从Solace PubSub +队列将消息传递给使用者后,如果客户端在发送回确认之前取消绑定,则将仅重新发送该消息。例外情况是特定于具有session.recover()操作的JMS客户端。
如果已经发送但未确认的消息需要重新发送到C#应用程序,则客户端将需要取消绑定并重新绑定到队列。请注意,如果还有其他客户端绑定到队列,则在您的客户端重新绑定之前,可能会将邮件重新发送给这些客户端。