我正在嘗試在MassTransit v3中使用C#和RabbitMQ實現只發布總線,其中總線沒有使用者。這個概念是消息將被髮布和排隊,然後一個單獨的微服務將消耗隊列中的消息。看看this SO answer,必須指定接收端點,以便消息實際排隊。但是,這似乎是contradict the common gotchas in the MassTransit docs,其中指出If you need to only send or publish messages, don’t create any receive endpoints
。使用C#和RabbitMQ在MassTransit v3中實現只發布總線
下面是一些示例代碼:
public class Program
{
static void Main(string[] args)
{
var bus = BusConfigurator.ConfigureBus();
bus.Start();
bus.Publish<IItemToQueue>(new ItemToQueue { Text = "Hello World" }).Wait();
Console.ReadKey();
bus.Stop();
}
}
public static class BusConfigurator
{
public static IBusControl ConfigureBus()
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), hst =>
{
hst.Username("guest");
hst.Password("guest");
});
cfg.ReceiveEndpoint(host, "queuename", e =>
{
e.Consumer<MyConsumer>();
});
});
return bus;
}
}
public interface IItemToQueue
{
string Text { get; set; }
}
public class ItemToQueue : IItemToQueue
{
public string Text { get; set; }
}
public class MyConsumer : IConsumer<IItemToQueue>
{
public async Task Consume(ConsumeContext<IItemToQueue> context)
{
await Console.Out.WriteLineAsync(context.Message.Text);
}
}
在此示例中,我收到了RabbitMQ的隊列中的消息符合市場預期,這是由MyConsumer
它寫的Hello World控制檯消耗,消息隨後從隊列中刪除。
然而,當我從上面除去下面的代碼並重新運行樣品:
cfg.ReceiveEndpoint(host, RabbitMqConstants.ValidationQueue, e =>
{
e.Consumer<MyConsumer>();
});
臨時隊列創建(具有生成的名稱)和消息似乎從未被放置到臨時隊列。當總線停止時,該隊列將被刪除。
我遇到的問題是指定了ReceiveEndpoint,消息將從發佈程序中的隊列中消耗並被刪除(意味着消費者微服務不會處理排隊的項目)。沒有指定RecieveEndpoint,就會使用一個臨時隊列(並且消費者微服務不知道這個臨時隊列的名稱),這個消息似乎永遠不會排隊,並且當總線停止時隊列被刪除,如果不是該程序失敗了。
有an example of a send only bus in the MassTransit docs但它是非常基本的,所以我想知道如果有人有任何建議?
雖然您不需要發佈者/發件人的接收端點,但確實需要它們在某個地方,否則就沒有綁定到消息交換的隊列,而且這些消息也不會路由到任何地方 - 從而消失。 –