C# 适用于所有消费者/所有消息类型的公共交通过滤器

C# 适用于所有消费者/所有消息类型的公共交通过滤器,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,我正在尝试创建一个过滤器,该过滤器将对所有消息类型执行。理想情况下,您只需注册一次过滤器,而不是为每个消费者注册。(我也想在发布方面做同样的事情)。我需要它在一生的范围内。它只是从头中弹出一个值,并将其分配给DI容器将提供的生命周期范围的对象(发布端则相反) 我在Middleware上观看了Chris Patterson的twitch视频,我认为它接近我想要的38分钟,但他为特定消费者注册了过滤器。在消费者方面,我想我需要一个与消费者上下文无关的过滤器,但我不知道如何注册过滤器,以使其适用于所有

我正在尝试创建一个过滤器,该过滤器将对所有消息类型执行。理想情况下,您只需注册一次过滤器,而不是为每个消费者注册。(我也想在发布方面做同样的事情)。我需要它在一生的范围内。它只是从头中弹出一个值,并将其分配给DI容器将提供的生命周期范围的对象(发布端则相反)


我在Middleware上观看了Chris Patterson的twitch视频,我认为它接近我想要的38分钟,但他为特定消费者注册了过滤器。在消费者方面,我想我需要一个与消费者上下文无关的过滤器,但我不知道如何注册过滤器,以使其适用于所有消费者。我正在使用MT 7和Autofac。谁能给我看一些关于如何注册适用于所有使用者的作用域过滤器的示例代码?(如果是非常不同的,那么它将适用于所有出版商)?

您检查过文档了吗?它具有在端点级别和使用者级别配置的重试

Bus.Factory.CreateUsingInMemory(cfg =>
{
    cfg.ReceiveEndpoint("input-queue", e =>
    {
        e.UseMessageRetry(r => 
        {
            r.Immediate(5);
            r.Handle<DataException>(x => x.Message.Contains("SQL"));
        });
        e.Consumer<MyConsumer>(c => c.UseMessageRetry(r => 
            {
                r.Interval(10, TimeSpan.FromMilliseconds(200));
                r.Ignore<ArgumentNullException>();
                r.Ignore<DataException>(x => x.Message.Contains("SQL"));
            });
        );
    });
});
Bus.Factory.CreateUsingInMemory(cfg=>
{
ReceiveEndpoint(“输入队列”,e=>
{
e、 UseMessageRetry(r=>
{
r、 立即(5);
r、 句柄(x=>x.Message.Contains(“SQL”);
});
e、 消费者(c=>c.UseMessageRetry(r=>
{
r、 间隔(10,时间跨度从毫秒(200));
r、 忽略();
r、 忽略(x=>x.Message.Contains(“SQL”);
});
);
});
});

您检查过文档了吗?它具有在端点级别和使用者级别配置的重试

Bus.Factory.CreateUsingInMemory(cfg =>
{
    cfg.ReceiveEndpoint("input-queue", e =>
    {
        e.UseMessageRetry(r => 
        {
            r.Immediate(5);
            r.Handle<DataException>(x => x.Message.Contains("SQL"));
        });
        e.Consumer<MyConsumer>(c => c.UseMessageRetry(r => 
            {
                r.Interval(10, TimeSpan.FromMilliseconds(200));
                r.Ignore<ArgumentNullException>();
                r.Ignore<DataException>(x => x.Message.Contains("SQL"));
            });
        );
    });
});
Bus.Factory.CreateUsingInMemory(cfg=>
{
ReceiveEndpoint(“输入队列”,e=>
{
e、 UseMessageRetry(r=>
{
r、 立即(5);
r、 句柄(x=>x.Message.Contains(“SQL”);
});
e、 消费者(c=>c.UseMessageRetry(r=>
{
r、 间隔(10,时间跨度从毫秒(200));
r、 忽略();
r、 忽略(x=>x.Message.Contains(“SQL”);
});
);
});
});

如果需要在生存期范围内的筛选器,则需要使用范围筛选器(需要MassTransit v7)。这将为任何使用者注册筛选器,以便执行它。您确实需要将过滤器设置为通用过滤器,将
T
作为消息类型,您可以选择使用或忽略它

public class MyFilter<T> :
    IFilter<ConsumeContext<T>>
    where T : class
{
    SomeScopedObject _obj;

    public MyFilter(SomeScopedObject obj) 
    {
        _obj = obj;
    }
  
    public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
    {
        // do your thing with _obj

        await next.Send(context);
    }

    public void Probe(ProbeContext context)
    {
    }
}
公共类MyFilter:
IFilter
T:在哪里上课
{
SomeScopedObject_obj;
公共MyFilter(SomeScopedObject对象)
{
_obj=obj;
}
公共异步任务发送(ConsumeContext上下文,IPipe下一步)
{
//用obj做你的事
等待下一步。发送(上下文);
}
公共无效探测(ProbeContext上下文)
{
}
}
然后,在接收端点上,在使用者之前配置筛选器

e.UseConsumeFilter(typeof(MyFilter<>));
e.UseConsumeFilter(typeof(MyFilter));
这将为每个使用者/消息配置在使用者容器范围内执行的过滤器版本

您可以对发布/发送执行相同的操作


位于站点上。

如果您需要在生存期范围内的筛选器,则需要使用作用域筛选器(需要MassTransit v7)。这将为任何使用者注册筛选器,以便执行它。您确实需要将过滤器设置为通用过滤器,将
T
作为消息类型,您可以选择使用或忽略它

public class MyFilter<T> :
    IFilter<ConsumeContext<T>>
    where T : class
{
    SomeScopedObject _obj;

    public MyFilter(SomeScopedObject obj) 
    {
        _obj = obj;
    }
  
    public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
    {
        // do your thing with _obj

        await next.Send(context);
    }

    public void Probe(ProbeContext context)
    {
    }
}
公共类MyFilter:
IFilter
T:在哪里上课
{
SomeScopedObject_obj;
公共MyFilter(SomeScopedObject对象)
{
_obj=obj;
}
公共异步任务发送(ConsumeContext上下文,IPipe下一步)
{
//用obj做你的事
等待下一步。发送(上下文);
}
公共无效探测(ProbeContext上下文)
{
}
}
然后,在接收端点上,在使用者之前配置筛选器

e.UseConsumeFilter(typeof(MyFilter<>));
e.UseConsumeFilter(typeof(MyFilter));
这将为每个使用者/消息配置在使用者容器范围内执行的过滤器版本

您可以对发布/发送执行相同的操作


是在网站上。

好的,我现在开始考虑这个问题——我认为过滤器的通用参数必须是消费者类型。我现在知道我可以做一个过滤器了。这对我来说开始有意义了。好吧,我现在开始思考这个问题——我认为过滤器的泛型参数必须是消费者类型。我现在知道我可以做一个过滤器了。这对我来说开始有意义了。谢谢你,我想我明白我在哪里感到困惑了。我无法理解端点、队列和使用者之间的关系。听起来端点和队列不是一回事。在哪里可以更好地理解这一点?接收端点映射到单个队列,因此在这种情况下它们可以被视为同义词。谢谢,我想我理解我的困惑所在。我无法理解端点、队列和使用者之间的关系。听起来端点和队列不是一回事。我从哪里可以更好地理解这一点?接收端点映射到单个队列,因此在本场景中它们可以被视为同义词。谢谢你--我对Chris的评论是一样的--我不太了解端点和队列之间的关系。如果我有一个总线实例,它处理许多不同类型的使用者,这些使用者使用许多不同类型的消息,那么这是许多队列/一个端点吗?(我在寻找一种“全局”过滤器——一种适用于任何类型消息的过滤器)谢谢——和我对Chris的评论一样——我不太了解端点和队列之间的关系。如果我有一个巴士实例