Rabbitmq masstransit批量处理/使用邮件

Rabbitmq masstransit批量处理/使用邮件,rabbitmq,masstransit,Rabbitmq,Masstransit,我对消费信息有着清晰的理解: 这些实现一次只处理一条消息 我需要一次批量处理多封邮件。MassTransit当前没有批处理邮件。您可以尝试使用TPL和Reactive的混合方式将消息读入一个批,但MassTransit的目的和设计是将批分解为可以单独处理的消息 如果您需要批处理,也许像Event Hub或Kafka这样的东西更适合您的目的。事实证明,今天您可以这样做: public class MyConsumer : IConsumer<Batch<MyMessage>>

我对消费信息有着清晰的理解:

这些实现一次只处理一条消息


我需要一次批量处理多封邮件。

MassTransit当前没有批处理邮件。您可以尝试使用TPL和Reactive的混合方式将消息读入一个批,但MassTransit的目的和设计是将批分解为可以单独处理的消息


如果您需要批处理,也许像Event Hub或Kafka这样的东西更适合您的目的。

事实证明,今天您可以这样做:

public class MyConsumer : IConsumer<Batch<MyMessage>>
{
    public async Task Consume(ConsumeContext<Batch<MyMessage>> context)
    {
        ...
    }
}
公共类消费者:IConsumer
{
公共异步任务使用(使用上下文)
{
...
}
}

公共交通现在有了一个实验性的功能,可以批量处理单个信息

配置您的总线:

_massTransitBus = Bus.Factory.CreateUsingRabbitMq(
                cfg =>
                    {
                        var host = cfg.Host(new Uri("amqp://@localhost"),
                            cfg =>
                                {
                                    cfg.Username("");
                                    cfg.Password("");
                                });

                        cfg.ReceiveEndpoint(
                            host,
                            "queuename",
                            e =>
                                {
                                    e.PrefetchCount = 30;
                                    e.Batch<MySingularEvent>(
                                        ss =>
                                            {
                                                ss.MessageLimit = 30;
                                                ss.TimeLimit = TimeSpan.FromMilliseconds(1000);
                                                ss.Consumer(() => new BatchSingularEventConsumer());
                                            });
                                });
                    });
\u massTransitBus=Bus.Factory.CreateUsingRabbitMq(
cfg=>
{
var host=cfg.host(新Uri(“amqp://@localhost”),
cfg=>
{
cfg.用户名(“”);
cfg.密码(“”);
});
接收端点(
主办
“队列名称”,
e=>
{
e、 预取计数=30;
e、 批处理(
ss=>
{
ss.MessageLimit=30;
ss.TimeLimit=时间跨度(从毫秒开始)(1000);
ss.Consumer(()=>newbatchsingulareventconsumer());
});
});
});
并创建您的消费者:

public class BatchSingularEventConsumer: IConsumer<Batch<MySingularEvent>>
{
    public Task Consume(ConsumeContext<Batch<MySingularEvent>> context)
    {           
         Console.WriteLine($"Number of messages consumed {context.Message.Length}");
         return Task.CompletedTask;
    }
}
公共类BatchEventConsumer:IConsumer
{
公共任务消费(消费上下文)
{           
WriteLine($“使用的消息数{context.Message.Length}”);
返回Task.CompletedTask;
}
}
您可以使用消息限制时间限制配置批处理

我建议阅读Chris Patterson关于这个问题的文章,特别是关于预回迁的部分

批量大小必须小于或等于任何预回迁计数或并发消息传递限制,才能达到大小限制。如果其他限制阻止达到批量大小,则将永远不会调用消费者