2016-09-18 6 views
1

Привет, enybody знает, как решить следующую проблему в MassTransit: потребитель получает запрос и ответ на него, но ответ не возвращается в client.Request. метод. Я создал проект в ASP NET WEB API и я реализовал Запрос связи/Response интерфейса IRequestClient:MassTransit получить ответ от потребителя

public class RequestResponseCommandProvider<TRequest, TResponse> 
    : IRequestResponseCommandProvider<TRequest, TResponse> 
    where TRequest : class, ICommandQueueName 
    where TResponse : class 
{ 
    private readonly IBusControl _bus; 
    private readonly string _hostUri; 
    public RequestResponseCommandProvider(IBusControl bus, 
     string hostUri) 
    { 
     _bus = bus; 
     _hostUri = hostUri; 
    } 

    public TResponse RequestResponseCommand(TRequest command) 
    { 
     _bus.Start(); 
     var serviceAddress = new Uri(_hostUri + command.QueueName); 
     IRequestClient<TRequest, TResponse> client = 
      _bus.CreateRequestClient<TRequest, TResponse>(serviceAddress, TimeSpan.FromSeconds(10)); 
     return client.Request(command).Result; //there should back response 
    } 
} 

я создал конфигурацию ServiceBus в качестве модуля в Autofac:

public class BusModule : Autofac.Module 
{ 
    private readonly string _hostUri; 
    IEnumerable<IConfigurableConsumer> _consumers; 

    public BusModule(string hostUri, IEnumerable<IConfigurableConsumer> consumers) 
    { 
     _hostUri = hostUri; 
     _consumers = consumers; 
    } 

    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()); 

     builder.Register(r => Bus.Factory.CreateUsingRabbitMq(sfc => 
     { 
      var host = sfc.Host(new Uri(_hostUri), h => 
      { 
       h.Username("guest"); 
       h.Password("guest"); 
      }); 

      if (_consumers != null) 
      { 
       foreach (var consumer in _consumers) 
       { 
        consumer.Configure(sfc); 
       } 
      } 
     })) 
     .As<IBus>() 
     .As<IBusControl>() 
     .SingleInstance(); 

     builder.RegisterType<RecieveObserver>() 
      .As<IReceiveObserver>(); 
    } 
} 

Потребители добавляют конструктор. Provider вводится в эксплуатацию:

public class TestLayer : ITestLayer 
{ 
    private readonly IRequestResponseCommandProvider<IAddTestCommand, ResponseCommand> _provider; 
    public TestLayer(
     IRequestResponseCommandProvider<IAddTestCommand, ResponseCommand> provider) 
    { 
     _provider = provider; 
    } 
    public ServiceResult CreateTest(TestRecord record) 
    { 
     ServiceResult result; 
     try 
     { 
      var tmp = _provider.RequestResponseCommand(new AddTestCommand() { Record = "d3d32" }); 
      result = new ServiceResult(); 
     } 
     catch (Exception ex) 
     { 
      result = new ServiceResult(); 
      result.AddError($"Wystąpił problem podczas zapisu do bazy danych: {ex}"); 
     } 

     return result; 
    } 
} 

Когда я проверяю очереди в RabbitMQ все сообщения выглядит как этот: RabbitMQ queue

Я уже видел Sample-RequestResponse сделал Криса Паттерсона, но у меня есть проблема, когда я используйте инъекцию зависимости. буду благодарен за помощь, что я сделал неправильно .. Существует также все хранилище на GitHub, где вы можете найти простой проект, где этот код включен, и по-прежнему не работает: My GitHub

ответ

0

два вопроса:

  1. Леновый экземпляр автобуса - не очень хорошая идея, так как это занимает довольно много времени, и в вашем случае вы получите большой тайм-аут, когда IBus будет разрешен впервые.
  2. Вы не получаете ответа, потому что вам нужно запустить автобус, чтобы получить что-либо вообще. Если вы не запустите автобус, вы можете отправить его только.