gpt4 book ai didi

masstransit - 使用 MassTransit 发布事件

转载 作者:行者123 更新时间:2023-12-04 13:18:34 31 4
gpt4 key购买 nike

我正在尝试在一个微服务中发布消息并在另一个微服务中获取它,但无法使用带有RabbitMQ MassTransit 5.5.3 来实现此目的强>.

据我所知,我们不必创建 ReceiveEndpoint 就可以发布事件,所以我只是在两个服务中创建相同的消息接口(interface)并发布消息,但是作为我可以在 RabbitMQ 中看到它要么无处可去(如果未映射到队列)要么进入“_skipped”队列。

发布者:

namespace Publisher
{
class Program
{
static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
IRabbitMqHost host = cfg.Host("host", "vhost", h =>
{
h.Username("xxx");
h.Password("yyy");
});
});

bus.Start();

await bus.Publish<Message>(new { Text = "Hello World" });

Console.ReadKey();

bus.Stop();
}
}

public interface Message
{
string Text { get; set; }
}
}

消费者:

namespace Consumer
{
class Program
{
static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
IRabbitMqHost host = cfg.Host("host", "vhost", h =>
{
h.Username("xxx");
h.Password("yyy");
});

cfg.ReceiveEndpoint(host, e =>
{
e.Consumer<MbConsumer>();
});
});

bus.Start();

bool finish = false;

while(!finish)
{
await Task.Delay(1000);
}

bus.Stop();
}
}

public interface Message
{
string Text { get; set; }
}

public class MbConsumer : IConsumer<Message>
{
public async Task Consume(ConsumeContext<Message> context)
{
await Console.Out.WriteLineAsync(context.Message.Text);
}
}
}

我正在尝试让消费者在消息发布后收到消息,但消费者没有收到。我认为这是因为完整的消息类型不同(“Publisher.Message”与“Consumer.Message”)所以消息契约(Contract)不同。我应该如何修复此代码以在消费者中获取事件?看起来我遗漏了一些关于 RabbitMQMassTransit 的基本知识。

最佳答案

你的猜测是正确的。 MassTransit 使用完全限定的类名作为消息协定名。 MassTransit 还使用基于类型的路由,因此 FQCN 用于创建交换和绑定(bind)。

因此,如果您将消息类移动到单独的命名空间,例如:

namespace Messages
{
public interface Message
{
string Text { get; set; }
}
}

然后您可以在发布消息时引用此类型

await bus.Publish<Messages.Message>(new { Text = "Hello World" });

并定义你的消费者

public class MbConsumer : IConsumer<Messages.Message>
{
public async Task Consume(ConsumeContext<Message> context)
{
await Console.Out.WriteLineAsync(context.Message.Text);
}
}

它会起作用。

您可能还想查看 RMQ 管理 UI 以了解 MassTransit 拓扑。使用您的代码,您将看到两个交换器,一个 Publisher.Message 和另一个 Consumer.Message,其中您的消费者队列绑定(bind)到 Consumer.Message 交换,但是您将消息发布到 Publisher.Message 交换,它们就消失了。

我还建议为您的接收端点指定一个有意义的端点名称:

cfg.ReceiveEndpoint(host, "MyConsumer", e =>
{
e.Consumer<MbConsumer>();
});

关于masstransit - 使用 MassTransit 发布事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57112672/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com