2017-03-01 1 views
0

Je travaille actuellement avec l'API Zendesk et la création d'utilisateurs. J'utilise le cadre CompletableFuture pour effectuer l'opération de création des utilisateurs, puis ajouter un rappel pour gérer le résultat. Toutefois, le résultat de la méthode createUsers() est un objet JobStatus qui peut avoir le statut "en attente", "terminé", "en cours de fonctionnement". Ce que je voudrais, c'est que le rappel ne soit exécuté que lorsque le statut est "terminé". Est-ce possible? Si le statut est "mis en file d'attente", je souhaite qu'il continue d'attendre jusqu'à ce que le résultat soit "terminé".Exécuter uniquement le rappel CompletableFuture lorsque l'état du résultat est terminé

Pour cet exemple, supposons que la liste contient un ensemble d'utilisateurs à créer.

public void createEndUsers(Zendesk zd, List<User> usersToBeCreated){ 
    final static CompletableFuture<JobStatus<User>> promise = new CompletableFuture<>(); 

    promise.supplyAsync(() -> { 
      JobStatus<User> js = zd.createUsers(usersToBeCreated); 
      return js; 
     }).thenAccept(Testing::updateDB); 
} 

public void updateDB(JobStatus<User> resultObject){ 
    //perform various operations on the JobStatus object 
} 
+0

Comment l'auriez-vous fait si vous n'aviez pas CompletableFuture? Il n'y a pas de magie ici, vous devrez interroger JobStatus pour son état ou createUsers devrait être réécrit pour ne pas retourner un objet intermédiaire. – john16384

+0

createUsers ne peut pas être réécrit car il fait partie de l'API Zendesk et je ne veux pas me mêler de cela. Pour le reste, je pourrais simplement faire une boucle qui vérifie l'API Zendesk et met à jour l'état de l'objet JobStatus et continue à le faire jusqu'à ce que le statut soit "terminé", mais j'espérais qu'il y avait une façon plus élégante de faire un rappel sur certaines conditions. – Kristianasp

+0

Il y a un appel d'API qui crée un seul utilisateur. Il semble revenir seulement lorsque le travail est terminé. Il semble que vous pourriez simplement appeler plusieurs d'entre eux en parallèle jusqu'à ce que vous les ayez tous créés. –

Répondre

0

Si vous utilisez le code:

private static final int DELAY = 100; 
public void createEndUsers(Zendesk zd, List<User> usersToBeCreated){ 
    final CompletableFuture<JobStatus<User>> promise = new CompletableFuture<>(); 

    promise.supplyAsync(() -> { 
     JobStatus<User> js = zd.createUsers(usersToBeCreated); 
     JobStatus.JobStatusEnum jsStatus = js.getStatus(); 

     while (jsStatus == JobStatus.JobStatusEnum.working || jsStatus == JobStatus.JobStatusEnum.queued){ 
      try{ 
       Thread.sleep(DELAY); 
      } catch(InterruptedException e){ 
       throw new RuntimeException("Interrupted exception occurred while sleeping until the next attempt of retrieving the job status for the job " + js.getId(), e); 
      } 
      js = zd.getJobStatus(js); 
      jsStatus =js.getStatus(); 
     } 
     return js; 
    }).thenAccept(Testing::updateDB); 
} 

public static void updateDB(JobStatus<User> resultObject){ 
    //perform various operations on the JobStatus object 
} 

L'opération de sommeil est certainement pas idéal, mais via l'API Zendesk vous ne pouvez vérifier l'état d'emploi état d'achèvement.