2017-04-03 2 views
1

J'ai un rapport qui appelle le service métier via l'appel de méthode Masstransit IRequestClient.Request.Appel Masstransit IRequestClient.Request à partir du blocage de travail Quartz

Si ce rapport est généré à partir de l'interface utilisateur (contrôleur ASP.NET MVC), tout fonctionne, mais si le même rapport est généré à partir de la méthode de travail Quartz .net, l'appel ne revient jamais.

exemple de code est ici:

//client is an instance of MessageRequestClient class 
var response = await client.Request(new GetEntityCommand 
     { 
      Ids = ids, 
      ExcludeDeleted = excludeDeleted 
     }).ConfigureAwait(false); 

Code de la consommation:

public class GetEntityCommandConsumer : IConsumer<IGetEntityCommand> 
{ 
    private readonly IEntityService _entityService; 

    public GetEntityCommandConsumer(IEntityService entityService) 
    { 
     _entityService= entityService; 
    } 

    public Task Consume(ConsumeContext<IGetEntityCommand> context) 
    { 
     var ids = context.Message.Ids; 
     var entities = _entityService.GetAll(ids, context.Message.ExcludeDeleted); //database NHibernate call 
     var result = 
      context.RespondAsync(new GetEntityCommandResponse 
      { 
       Success = true, 
       Entities = entities.Select(x => x.ToDTO).ToList() 
      }); 

     return result; 
    } 
} 
+0

Serait bien de voir le code de la consommation aussi bien. –

+0

Ajout d'un code de consommateur au message racine. Le code du consommateur réside dans l'application console. Le débogueur montre que le consommateur a été appelé. Il semble que MT ait besoin d'un thread pour renvoyer les résultats de la tâche, mais il est bloqué par un autre code. –

+0

Avez-vous essayé de rendre la méthode consume async et au lieu de retourner la tâche, appelez 'await context.RespondAsync (...)'? –

Répondre

0

Comme problème habituel était dans mon propre code :) Il y avait deux cas de IBusControl mais attend qu'un seul. IBusControl qui a été utilisé à partir du travail n'a pas été démarré. Correction en utilisant "true" singletoned IBusControl.

0

Il ressemble à l'appel des consommateurs n'est pas attendu et la portée se disposée avant de terminer si vous obtenez une impasse.

Essayez ceci:

public async Task Consume(ConsumeContext<IGetEntityCommand> context) 
{ 
    var ids = context.Message.Ids; 
    var entities = _entityService.GetAll(ids, context.Message.ExcludeDeleted); //database NHibernate call 
    await 
     context.RespondAsync(new GetEntityCommandResponse 
     { 
      Success = true, 
      Entities = entities.Select(x => x.ToDTO).ToList() 
     }); 
} 
+0

Toujours l'impasse. S'il vous plaît, notez, ce consommateur de message est dans un processus séparé. Je pense que le consommateur est OK, quelque chose ne va pas avec les threads dans IRequestClient qui a utilisé du travail. –

+0

Je ne pense pas. Nous n'avons jamais eu de problèmes avec 'IRequestClient'. Il peut s'agir du code qui appelle le client de requête. J'essaierais de rendre la méthode synchrone et j'appellerais 'TaskUtil.Await (() => client.Request (...));' –