与连接到现有总线的使用者一起阅读消息

时间:2019-06-11 08:05:38

标签: .net-core rabbitmq masstransit

我正在尝试了解如何将消费者连接到现有的总线,如解释的here,但我不知道这应该如何工作

我的代码:

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

public class Program
{
    public static void Main()
    {
        var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
        {
            var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });
        });

        bus.Start();

        bus.ConnectConsumer<TestConsumer>();

        bus.Publish<IMessage>(new { Text = "Hi" });

        Console.WriteLine("Press any key to exit");
        Console.ReadKey();

        bus.Stop();
    }
}

public class TestConsumer : IConsumer<IMessage>
{
    public Task Consume(ConsumeContext<IMessage> context)
    {
        Console.Out.WriteLineAsync($"Received: {context.Message.Text}");
        return Task.CompletedTask;
    }
}

由于没有指定任何队列,所以我不知道消息的发送位置,因此我不知道如何使用消息。

是否有一种方法可以指定在哪个队列上在总线定义之外发送和写入消息?

我想念什么?

3 个答案:

答案 0 :(得分:0)

您在此处发布的内容

bus.Publish(new { Text = "Hi" });

是匿名类型,不是您要订阅的IMessage,我认为您需要创建IMessage接口,然后创建一些实现IMessage的类并通过总线发送

答案 1 :(得分:0)

代替使用:

bus.ConnectConsumer<TestConsumer>();

考虑使用:

sbc.ReceiveEndpoint("queue-name", e => e.Consumer<TestConsumer>());

这将创建一个名为“ queue-name”的队列,并将您的使用者连接到该队列。

如果事后需要将接收端点连接到总线,则可以使用:

host.ConnectReceiveEndpoint("queue-name", e => e.Consumer<TestConsumer>());

您需要从配置中保存主机,但是它将允许您在总线启动后添加接收端点。

答案 2 :(得分:0)

您链接的文档指出临时队列未接收到已发布的消息,并且用例数量有限。

据我所知,大众运输系统中的发件人和消费者之间是有区别的。

发件人将邮件发送到交换,而不是排队。 使用者负责创建队列并将此队列绑定到交换。队列交换绑定根据消息的类型自动完成。

因此,重要的是首先创建您的消费者。如果在没有消费者创建队列的情况下发送消息,则消息无处可去,并且会丢失。