2017-03-01 104 views
0

我目前正在使用Zendesk API並創建用戶。我正在使用CompletableFuture框架來執行創建用戶的操作,然後添加回調來處理結果。但是,createUsers()方法的結果是一個JobStatus對象,其狀態可能是「排隊」,「已完成」,「正在工作」。我希望只有當狀態爲「完成」時才能執行回調。這可能嗎?如果狀態爲「排隊」,我希望它一直等待,直到結果「完成」。只有當結果狀態完成時才執行CompletableFuture回調

對於此示例,假定列表包含一組要創建的用戶。

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

如果您沒有CompletableFuture,您會怎麼做?這裏沒有魔法,你需要輪詢JobStatus的狀態,或者createUsers應該被重寫爲不返回中間對象。 – john16384

+0

createUsers不能被重寫,因爲它是Zendesk API的一部分,我不想幹涉它。至於其他方面,我可以簡單地做一個循環來檢查Zendesk API並更新JobStatus對象的狀態,並在狀態「完成」之前一直這樣做,但我希望有一種更優雅的方式在某些條件下回調。 – Kristianasp

+0

有一個創建單個用戶的API調用。它似乎只在工作完成時纔會返回。看起來你可以直接調用其中的多個,直到你創建它們全部爲止。 – 2017-07-13 02:59:25

回答

0

如果你會使用的代碼:

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 
} 

沉睡的操作肯定是不理想,但通過的Zendesk API,你可以只檢查作業狀態完成狀態。

相關問題