【问题标题】:How to specify which Azure Service Bus Topic to use with MassTransit如何指定要与 MassTransit 一起使用的 Azure 服务总线主题
【发布时间】:2018-09-01 05:16:11
【问题描述】:

我尝试使用 MassTransit 将消息发布到 Azure 服务总线中名为 events 的主题。我在配置 MassTransit 以使用我的预定义主题 events 时遇到问题,而是为消息类型创建了一个由命名空间/类名命名的新主题。所以我想知道如何指定使用哪个主题而不是创建一个新主题。

这是我测试过的代码:

using System;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.AzureServiceBusTransport;
using Microsoft.ServiceBus;

namespace PublisherNameSpace
{
    public class Publisher
    {
        public static async Task PublishMessage()
        {
            var topic = "events";
            var bus = Bus.Factory.CreateUsingAzureServiceBus(
                cfg =>
                {
                    var azureServiceBusHost = cfg.Host(new Uri("sb://<busname>.servicebus.windows.net"), host =>
                    {
                        host.OperationTimeout = TimeSpan.FromSeconds(5);
                        host.TokenProvider =
                            TokenProvider.CreateSharedAccessSignatureTokenProvider(
                                "RootManageSharedAccessKey",
                                "<key>"
                            );
                    });

                    cfg.ReceiveEndpoint(azureServiceBusHost, topic, e =>
                    {
                        e.Consumer<TestConsumer>();
                    });
                });

            await bus.Publish<TestConsumer>(new TestMessage { TestString = "testing" });
        }
    }

    public class TestConsumer : IConsumer<TestMessage>
    {
        public Task Consume(ConsumeContext<TestMessage> context)
        {
            return Console.Out.WriteAsync("Consuming message");
        }
    }

    public class TestMessage
    {
        public string TestString { get; set; }
    }
}

【问题讨论】:

    标签: c# azureservicebus masstransit azure-servicebus-topics


    【解决方案1】:

    接受的答案清除订阅方:

    cfg.SubscriptionEndpoint(
        host,
        "sub-1",
        "my-topic-1",
        e =>
        {
            e.ConfigureConsumer<TestConsumer>(provider);
        });
    

    对于那些想知道如何在发布端正确配置总线的人,它应该如下所示:

    cfg.Message<TestMessage>(x =>
    {
        x.SetEntityName("my-topic-1");
    });
    

    然后您可以在总线上调用发布:

    await bus.Publish<TestMessage>(message);
    

    感谢@ChrisPatterson pointing this out to me

    【讨论】:

    • 不知道为什么官方文档没有这么清楚。我觉得很难理解。
    【解决方案2】:

    如果您想从特定主题消费,请创建订阅端点而不是接收端点,并在配置中指定主题和订阅名称。

    单元测试中显示了最简单的形式:

    https://github.com/MassTransit/MassTransit/blob/develop/tests/MassTransit.Azure.ServiceBus.Core.Tests/Subscription_Specs.cs

    【讨论】:

    • 谢谢,应该这样做。但是,在我的一项服务中,我仅限于 MassTransit 3.3.5(由于旧的 Newtonsoft.Json),其中未引入 SubscriptionEndpoint 方法。您是否也可以指定在该版本中使用哪个主题?
    • 该版本不支持。
    • 已更新。当然,一旦 v7 发布,它会再次改变。
    【解决方案3】:

    我能够使用 _sendEndpointProvider.GetSendEndpoint(new Uri("topic:shape")); 发送到 Azure 服务总线主题,其中...“shape”是主题名称。

    public class MassTransitController : ControllerBase
    {
        private readonly ILogger<MassTransitController> _logger;
        private readonly ISendEndpointProvider _sendEndpointProvider;
    
        public MassTransitController(ILogger<MassTransitController> logger, ISendEndpointProvider sendEndpointProvider)
        {
            _logger = logger;
            _sendEndpointProvider = sendEndpointProvider;
        }
    
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            try
            {
                var randomType = new Random();
                var randomColor = new Random();
    
                var shape = new Shape();
                shape.ShapeId = Guid.NewGuid();
                shape.Color = ShapeType.ShapeColors[randomColor.Next(ShapeType.ShapeColors.Count)];
                shape.Type = ShapeType.ShapeTypes[randomType.Next(ShapeType.ShapeTypes.Count)];
    
                var endpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri("topic:shape"));
                await endpoint.Send(shape);
    
                return Ok(shape);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    

    我还能够让 .NET 5 Worker Consumer 使用这样的代码......订阅“sub-all”将捕获所有形状......我将发表一篇博文/git repo这个。

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddMassTransit(x =>
                    {
                        x.UsingAzureServiceBus((context, cfg) =>
                        {
                            cfg.Host("Endpoint=sb://******");
    
                            cfg.SubscriptionEndpoint(
                                "sub-all",
                                "shape",
                                e =>
                            {
                                e.Handler<Shape>(async context =>
                                {
                                    await Console.Out.WriteLineAsync($"Shape Received: {context.Message.Type}");
                                });
    
                                e.MaxDeliveryCount = 15;
                            });
                        });
                    });
    
                    services.AddMassTransitHostedService();
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多