在MassTransit 3中实现邮件跟踪

时间:2016-01-14 17:39:08

标签: c# masstransit

我一直在使用带有Rabbit队列的MassTransit,并且已经实现了类似于此问题中的IMessageTracker:How to log failed message in masstransit?来跟踪消息重试并在重试发生时为我们提供一些监控,以及消息在重试序列中的位置 - 允许我们获取有关第三方端点何时导致我们重试的一些统计信息。这意味着我必须为每个消息id存储重试序列值,并在每次重试时检查它/增加它,然后在调用MessageWasReceivedSuccessfully时删除消息ID。另外,如果消息在所有重试后都失败了,我们就可以监视失败发生的时间(诚然,我们不需要这个消息跟踪器,但是当我为重试创建跟踪器时它变得明智了。)

我想升级到MassTransit 3,因为新的重试策略在这种情况下是有益的,但我找不到用MassTransit 3实现我的消息跟踪器的方法。

我目前的方法是使用消费观察器配置我的处理程序,使用接收观察器配置我的总线,如下所示:

sbc.ReceiveEndpoint(host, config.QueueName, ep =>
{
    ep.Consumer(() => _container.Resolve<IEventConsumer>());
    ep.Observer(new EventConsumeObserver());
});        

_busControl.ConnectReceiveObserver(new ReceiveObserver(container.Resolve<IMonitoringPublisher>()));

观察员如下:

public class ReceiveObserver : IReceiveObserver
{
    public ReceiveObserver()
    {
    }

    public async Task PreReceive(ReceiveContext context)
    {
        await Console.Out.WriteLineAsync("ReceiveObserver - PreReceive Observed");
    }

    public async Task PostReceive(ReceiveContext context)
    {
        await Console.Out.WriteLineAsync("ReceiveObserver - PostReceive Observed");
    }

    public async Task PostConsume<T>(ConsumeContext<T> context, TimeSpan duration, string consumerType) where T : class
    {
        await Console.Out.WriteLineAsync("ReceiveObserver - PostConsume Observed");
    }

    public async Task ConsumeFault<T>(ConsumeContext<T> context, TimeSpan duration, string consumerType, Exception exception) where T : class
    {
        await Console.Out.WriteLineAsync($"ReceiveObserver - ConsumeFault Observed - {exception.Message}.");
    }

    public async Task ReceiveFault(ReceiveContext context, Exception exception)
    {
        await Console.Out.WriteLineAsync("ReceiveObserver - ReceiveFault Observed");
    }
}

public class EventConsumeObserver : IObserver<ConsumeContext<IEvent>>
{
    public void OnNext(ConsumeContext<IEvent> value)
    {
        Console.WriteLine("EventConsumeObserver - OnNext");
    }

    public void OnError(Exception error)
    {
        Console.WriteLine("EventConsumeObserver - OnError");
    }

    public void OnCompleted()
    {
        Console.WriteLine("EventConsumeObserver - OnCompleted");
    }
}

这允许我监视何时发生重试(稍微修改),但是我找不到与消息跟踪器上的MessageWasReceivedSuccessfully方法等效的方法。另外,当我运行一个模拟异常被超时抛出的测试时,输出似乎没有接近on completed方法 - 跟踪如下:

(模拟超时)

ReceiveObserver - PreReceive Observed
Request timeout
EventConsumeObserver - OnNext
ReceiveObserver - PostConsume Observed
Request timeout
EventConsumeObserver - OnNext
ReceiveObserver - PostConsume Observed
Request timeout
EventConsumeObserver - OnNext
ReceiveObserver - PostConsume Observed
ReceiveObserver - ConsumeFault Observed - Call timed out

(未模拟超时)

ReceiveObserver - PreReceive Observed
Request success
EventConsumeObserver - OnNext

我希望在每次重试时都会有更明显的调用消耗错误,或者在重试发生时调用OnError并在每次事件发生后调用OnComplete,但情况似乎并非如此。

我是否缺少某种类型的观察者,或者是否有另一种方法可以进行重试,以便我可以监控它们何时发生以及在成功之前执行重试的次数?

1 个答案:

答案 0 :(得分:0)

您可能希望查看IConsumeObserver,它与实际消息消费更加一致,而不是消息接收。虽然两者都携带有趣的信息,但应该为消费者抛出的每个异常调用消费观察者。对于每种消费类型,也会调用Pre / Post使用方法。