var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var eventName = ea.RoutingKey;
var message = Encoding.UTF8.GetString(ea.Body);
ProcessEvent(eventName, message);
channel.BasicAck(ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: _queueName,
autoAck: false,
consumer: consumer);
private void ProcessEvent(string eventName, string message)`
{
//code send the acknowledgement here, before completing the processing
if (_subsManager.HasSubscriptionsForEvent(eventName)`
{
using (var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME))`
{
var subscriptions = _subsManager.GetHandlersForEvent(eventName);`
foreach (var subscription in subscriptions)`
{
if (subscription.IsDynamic)`
{
var handler = scope.ResolveOptional(subscription.HandlerType) as IDynamicIntegrationEventHandler;
dynamic eventData = JObject.Parse(message);`
handler.Handle(eventData);
}
当客户端使用 RabbitMQ 完全处理消息时,我需要确认。在我的应用程序中,一旦调用消费者构造函数就会发出确认。我希望只有在处理完成后才能完成。我为消息代理创建了一个公共类。但我希望此功能适用于特定的订阅事件。这是我的代码,我正在处理事件**
文档向我们展示了如何做到这一点:
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (ch, ea) =>
{
var body = ea.Body;
// ... process the message
// ACK the message
channel.BasicAck(ea.DeliveryTag, false);
};
String consumerTag = channel.BasicConsume(queueName, false, consumer);