2016-10-31 5 views
2

Я собираюсь преобразовать приложение с использованием MT3 с RabbitMQ в использование Azure Service Bus, а MassTransit не настраивает очередь таким же образом в Azure, как и с RMQ, и с документацией, находящейся на светлой стороне (here) Я хотел посмотреть, разрешил ли кто-нибудь еще этоMassTransit 3 с созданием очередей шины Azure

Я использую 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, который использует ному 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, панель сведений просто зависает (поэтому я не могу вручную настройте его на созданную вручную очередь)

Am I mi что-то? Alastair

ответ

3

Вам необходимо добавить сообщение потребителя для этого типа в конечную точку приема. Вышеприведенный код не имеет потребителя, поэтому нет связанных типов.

class YourConsumer : 
    IConsumer<RegisterNewCustomerCommand> 
{} 

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

Тогда вы будете иметь потребитель, который принимает этот тип сообщения, которое заставит MassTransit связать эту тему в очередь.

+0

Это похоже на трюк, спасибо! Я полагаю, что он просто гарантирует, что процессы будут срабатывать в правильном порядке. Я сфокусировался на том, чтобы первая часть приложения работала в первую очередь, но это привело к теме без очереди. По-видимому, под-сторона исправила это. – Alastair

 Смежные вопросы

  • Нет связанных вопросов^_^