c# - MassTransit 3 与 Azure 服务总线创建队列

标签 c# azure azureservicebus masstransit

我正在将应用程序从使用带有 RabbitMQ 的 MT3 转换为使用 Azure 服务总线,并且 MassTransit 在 Azure 中配置队列的方式与使用 RMQ 的方式不同,并且文档也比较简单(here)我想看看是否有其他人解决了这个问题

我使用 MT 3.4 和 Microsoft.ServiceBus 3.0 作为 TokenProvider,我有一个创建总线的实用程序类(遵循此 example ):

    public static IBus CreateBus()
    {
        var busControl = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
        {
            var host = sbc.Host(new Uri("sb://<sbname>.servicebus.windows.net/"), h =>
            {
                h.OperationTimeout = TimeSpan.FromSeconds(5);
                h.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<KeyName>", "<Key>");
            });

            sbc.ReceiveEndpoint(host, "command_queue", ep =>
            {
                ep.SubscribeMessageTopics = true;
                ep.UseRetry(Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)));
            });
        });

        return busControl;
    }

我有一个 Web API Controller ,它使用总线将命令发布到队列:

[RoutePrefix("customer")]
public class CustomerController : ApiController
{
    private readonly IBus _serviceBus;

    public CustomerController()
    {
        _serviceBus = AzureServiceBusUtils.CreateBus();
    }

    [HttpPost, Route("register")]
    public async Task<HttpResponseMessage> Register()
    {
        var command = JsonConvert.DeserializeObject<RegisterNewCustomerCommand>(Encoding.ASCII.GetString(Request.Content.ReadAsByteArrayAsync().Result));
        await _serviceBus.Publish(command);
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

RegisterNewCustomerCommand 只是一个简单的名称、地址等。C# 类:

namespace AZSB.Commands
{
    public class RegisterNewCustomerCommand
    {
        public string Name { get; }
        ...
        public RegisterNewCustomerCommand(...) {...}
    }
}

现在,当我通过发送消息时,会在 Azure (AZSB.Commands/RegisterNewCustomerCommand) 上创建一个主题,但这并没有像我期望的那样链接到 command_queue,并在我单击主题时添加到其中在 Azure 门户中,详细信息面板只是挂起(因此我无法手动将其配置到手动创建的队列)

我错过了什么吗? 阿拉斯泰尔

最佳答案

您需要在接收端点中添加该类型的消息使用者。上面的代码没有消费者,因此没有类型绑定(bind)。

class YourConsumer :
    IConsumer<RegisterNewCustomerCommand>
{}

cfg.ReceiveEndpoint("your_queue", x => 
{
    x.Consumer<YourConsumer>();
});

然后您将拥有一个接受该消息类型的使用者,这将导致 MassTransit 将主题绑定(bind)到队列。

关于c# - MassTransit 3 与 Azure 服务总线创建队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40340315/

相关文章:

c# - 游戏的架构模式

Azure 数据磁盘 - 从导出的磁盘文件获取文件

azure - 即使锁定未过期,在代理消息上也会出现 MessageLockLost 异常

azure - 监视 Azure 事件中心

c# - 使用 Mono API 启动新线程和打开对话框时出错

c# - ClassInitialize : no longer working in Visual Studio 2012 中生成的数据驱动测试

c# - 枚举 Active Directory 组成员(嵌套),包括域用户(主要组)

azure - 删除/删除通过 powershell 旋转新虚拟机时创建的所有资源

spring - 如何使用 Spring Batch 写入 Azure Blob?

c# - 跟踪服务总线消息主题订阅