C# MassTransit RabbitMq发送消息
在发送/发布消息时,我无法确定如何在我的C# MassTransit RabbitMq发送消息,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,在发送/发布消息时,我无法确定如何在我的GetSendEndpoint())任务中指定交换和队列 根据MassTransit文档,您可以指定交换和队列,如 GetSendEndpoint(new Uri("queue:input-queue")) 然而,我只能做一个或另一个 是否有指定exchange和队列的其他发送方式 我在Asp.Net Core中执行此操作,因此以下是我的配置: Startup.cs public void ConfigureServices(IServiceCollec
GetSendEndpoint())
任务中指定交换
和队列
根据MassTransit文档,您可以指定交换和队列,如
GetSendEndpoint(new Uri("queue:input-queue"))
然而,我只能做一个或另一个
是否有指定exchange和队列的其他发送方式
我在Asp.Net Core中执行此操作,因此以下是我的配置:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMassTransit();
services.AddSingleton(p => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host("rabbitmq://localhost", h =>
{
h.Username("admin");
h.Password("admin");
});
}));
services.AddSingleton<IBus>(p => p.GetRequiredService<IBusControl>());
services.AddSingleton<IHostedService, BusService>();
}
正如您所看到的,我只能指定队列名称。如果您指定了一个交换,则只有该交换在代理上声明。消息将直接发送到exchange
"exchange:your-exchange-name"
如果指定队列,则将声明该队列以及具有相同名称的交换,并且该交换将绑定到该队列。消息将被传递到同名的交换,交换将把它们传递到队列
"queue:your-queue-name"
如果需要不同的exchange和队列名称,可以使用以下命令指定这两个名称:
"exchange:your-exchange-name?bind=true&queue=your-queue-name"
或者,您可以简化,但两个队列有点混淆:
"queue:your-exchange-name&queue=your-queue-name"
在这里读克里斯的回答 似乎
交换是由MassTransit根据消息类型在发布消息时创建的。发布不会创建任何队列。队列是存储邮件以发送给消费者的地方。
将接收端点添加到总线时,会创建队列。对于添加到接收端点的使用者、处理程序和saga,将创建和绑定交换,以便接收端点(通过队列)接收发布到交换的消息。
所以,如果我的发布者没有定义接收端点,那么我发送的任何消息都将丢失,因为没有队列或绑定
这里的进一步阅读似乎进一步证实了这一点
因此,基于上述链接,为了实现我想要的,即创建exchange并将其绑定到队列,我需要在Uri
中指定它
var sendEndpoint = bus.GetSendEndpoint(new Uri("rabbitmq://localhost/vhost1/exchange1?bind=true&queue=queue1"));
其中exchange1
是交换,queue1
是队列,bind=true
将队列绑定到交换
如果坚持原始的MT设计,消费者需要在设置交换和队列之前运行,然后制作人才能开始发布?这似乎减少了出版商的灵活性?谢谢,克里斯,我知道这一点。但是,有没有一种方法可以像使用RabbitMq客户端那样,通过指定一个交换然后排队来发送它呢?老实说,我不知道你的意思。在RabbitMQ中直接发送到队列的唯一方法是指定一个空交换(
“”
),并将队列名称放入RoutingKey中。MassTransit没有公开这种功能。exchange:您的exchange名称?bind=true&queue=您的队列名称
这符合我的目的:)thanksChris还要确认,当publisher向exchange发送消息时,是否可以执行确认。主要是确认消息已传递到队列。当我意识到您要求为exchange和队列指定不同的名称时,我更新了我的答案。我不是从你最初的问题中得到的。
var sendEndpoint = bus.GetSendEndpoint(new Uri("rabbitmq://localhost/vhost1/exchange1?bind=true&queue=queue1"));