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"));