2015-11-19 2 views
1

J'ai une saga qui vérifie l'état d'un appel d'API toutes les 30 secondes si le statut renvoyé de l'appel est terminé la saga est terminée, sinon la saga attend 30 secondes et tente à nouveau. Si l'appel d'API n'a pas renvoyé une réponse réussie dans les 60 minutes, la saga est expirée et terminée.Nservicebus saga timeout

Je n'arrive pas à obtenir le délai d'attente de 60 minutes. Le code que j'ai est

public class MonitorSubmissionFeedSagaData: IContainSagaData 
{ 
    public Guid Id { get; set; } 

    public string Originator { get; set; } 

    public string OriginalMessageId { get; set; } 

    public bool TimeoutSet { get; set; } 

    [Unique] 
    public string JobId { get; set; } 
} 

public class MonitorSubmissionFeedSaga : Saga<MonitorSubmissionFeedSagaData>, 
    IAmStartedByMessages<MonitorFeedSubmissonCommand>, 
    IHandleMessages<StartCheckSubmissionCommand>, 
    IHandleTimeouts<MonitorSubmissionFeedSagaTimeout> 
{ 
    public const int SagaTimeoutInMinutes = 60; 

    public IEmpathyBrokerClientApi PostFileService { get; set; } 

    protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MonitorSubmissionFeedSagaData> mapper) 
    { 
     mapper.ConfigureMapping<MonitorFeedSubmissonCommand>(x => x.JobId).ToSaga(saga => saga.JobId); 

    } 

    public void Handle(MonitorFeedSubmissonCommand message) 
    { 
     Data.JobId = message.JobId; 

     CheckTimeout(); 

     Bus.Send(new StartCheckSubmissionCommand 
     { 
      JobId = Data.JobId 
     }); 
    } 

    public void Handle(StartCheckSubmissionCommand message) 
    { 
     Log.Info("Saga with JobId {0} received", Data.JobId); 

     bool isCompleted = GetJobStatus(message.JobId); 

     while (isCompleted) 
     { 
      Thread.Sleep(30000); 
      isCompleted = GetJobStatus(message.JobId); 
     } 

     MarkAsComplete(); 
    } 

    public void CheckTimeout() 
    { 
     RequestTimeout<MonitorSubmissionFeedSagaTimeout>(TimeSpan.FromMinutes(SagaTimeoutInMinutes)); 
    } 

    public void Timeout(MonitorSubmissionFeedSagaTimeout state) 
    { 
     MarkAsComplete(); 
    } 

    bool GetJobStatus(string jobId) 
    { 
     return false; 
     var status = PostFileService.GetJobIdStatus(jobId); 
     if (status.state == "FAILURE" || status.state == "DISCARDED") 
     { 
      return false; 
     } 
     return true; 
    } 

} 

Quelqu'un peut-il voir où je vais mal?

merci

Répondre

4

Votre Saga doit rester inactive. Vous le gardez en vie avec une boucle de temps. Le message de délai d'attente arrive à un moment donné, puis vous devriez vérifier ce qui devrait arriver. Soit une autre caisse ou MarkAsComplete. J'ai écrit cela dans le Bloc-notes, donc il pourrait ne pas compiler. Mais c'est pour avoir une idée. Un autre commentaire pourrait être que la Saga elle-même ne devrait pas appeler à des services externes. De préférence même pas à une base de données. Déléguez ceci à un autre service. Toutes les 30 secondes, envoyez un message à un autre gestionnaire. Ce gestionnaire doit appeler WebService/WebAPI. Quand il peut confirmer que tout est correct, répondez à la Saga originale. Quand ce n'est pas correct, laissez-le être. La Saga enverra des messages toutes les 30 secondes pour réessayer.

Après 60 minutes, le Saga devrait cesser d'envoyer des messages et MarkAsComplete.