2016-10-31 51 views
2

我正在将使用MT3和RabbitMQ的应用程序转换为使用Azure Service Bus,MassTransit未在Azure中以与使用RMQ相同的方式配置队列,并且(here)我想看看是否有其他人已经解决了这个问题具有Azure服务总线创建队列的MassTransit 3

我正在使用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控制器,它使用BU s到发布命令队列:

[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门户内的主题,细节面板只是挂起(所以我不能手动将其配置为手动创建的队列)

我是mi什么东西? Alastair

回答

3

您需要在接收端点中为该类型添加消息使用者。上面的代码没有使用者,所以没有绑定的类型。

class YourConsumer : 
    IConsumer<RegisterNewCustomerCommand> 
{} 

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

那么你就必须接受该消息类型,这将导致MassTransit的话题绑定到队列中的消费者。

+0

似乎已经做了伎俩,谢谢!我想它只是确保流程以正确的顺序启动。我专注于让应用程序的发布端工作,但是这导致没有排队的主题,副端似乎已经解决了这个问题。 – Alastair

相关问题