我刚刚从 RabbitMq 迁移到 Amazon SQS。
我不希望发生的一件事是,当我使用 docker & IHostedService 启动时,消息类型被创建为队列。
public void ConfigureServices(IServiceCollection services)
{
services.AddMassTransit(x =>
{
x.AddConsumer<EmailSentConsumer>();
x.AddBus(provider => Bus.Factory.CreateUsingAmazonSqs(cfg =>
{
cfg.Host("eu-west-2", h =>
{
h.AccessKey("********");
h.SecretKey("********");
});
cfg.ReceiveEndpoint("logging_example_queue", e =>
{
//e.ConfigureConsumer<EmailSentConsumer>(provider);
//e.ConfigureConsumer<EmailReceivedConsumer>(provider);
});
cfg.ConfigureEndpoints(provider);
}));
});
services.AddSingleton<IHostedService, BusService>();
services.AddMassTransitHostedService();
}
public class EmailSentConsumer : IConsumer<EmailSent>
EmailSent被设置为队列,而我只是想让这个服务监听logging_example_queue中的事件类型。
当我通过一个简单的控制台应用来设置这个,并且在configure endpoint内的Consumers
cfg.ReceiveEndpoint("logging_queue", e =>
{
e.Consumer<ConsumerTo>();
e.Consumer<AnotherConsumer>();
});
这个很好用,有什么建议吗?
编辑
所以,我已经尝试了Chris的答案,这并没有像建议的那样创建队列,但我确实需要主题。我想以这个为例。
Topic EmailSent: Queue: LoggingQueue: EmailListener
下面是AWS的截图。
EmailSent
应该在SNS中被创建为一个主题,而不是队列。
如果你不希望创建主题,请在接收端点配置中添加。
ConfigureConsumeTopology = false;
到接收端点配置中。另外,不要调用 Publish
因为这样也会创建主题。
cfg.ReceiveEndpoint("logging_example_queue", e =>
{
//e.ConfigureConsumer<EmailSentConsumer>(provider);
//e.ConfigureConsumer<EmailReceivedConsumer>(provider);
});
cfg.ConfigureEndpoints(provider);
这就是问题所在,通过修改configureendpoints来解决,如下图。
cfg.ReceiveEndpoint("logging_example_queue", e =>
{
e.ConfigureConsumers(provider);
});