2016-09-18 1 views
1

Salut est-ce que enybody sait comment résoudre le problème suivant dans MassTransit: Le consommateur reçoit une requête et une réponse, mais la réponse ne retourne pas dans client.Request. méthode. J'ai créé projet ASP API NET WEB et je l'ai mis en œuvre demande/communication de réponse par l'interface IRequestClient:MassTransit obtenir la réponse du consommateur

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 
    } 
} 

J'ai configuration créé de serviceBus comme module dans Autofac: sont ajoutés

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>(); 
    } 
} 

consommateurs par constructeur. fournisseur est injecté en service:

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; 
    } 
} 

Quand je vérifie les files d'attente dans RabbitMQ tous les messages ressemble à celui-ci: RabbitMQ queue

Je l'ai déjà vu Sample-RequestResponse faite par Chris Patterson, mais j'ai problème quand je utiliser l'injection de dépendance. Je serai reconnaissant de l'aide que je l'ai fait mal .. Il y a aussi tout dépôt sur GitHub où vous pouvez trouver le projet simple où ce code est inclus et ne fonctionne toujours pas: My GitHub

Répondre

0

Deux questions:

  1. L'instanciation paresseuse du bus n'est pas une bonne idée, car cela prend un certain temps et dans votre cas, vous obtiendrez un long délai d'expiration lorsque IBus sera résolu pour la première fois.
  2. Vous n'obtenez aucune réponse car vous devez démarrer le bus pour qu'il reçoive quoi que ce soit. Si vous ne démarrez pas le bus, vous pouvez uniquement l'envoyer.