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 到这些客户端。
我正在用 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 到这些客户端。