2017-05-26 162 views
0

我有一個Spring Cloud微服務,它在卡夫卡經紀人上發佈消息,這個微服務可以通過REST api訪問。ListenableFuture - 如何在返回之前等待

我想將提交狀態返回給調用者,但看起來像Java不等待。如何讓我的代碼在返回之前等待成功或失敗?

繼承人的代碼:

kafkaProduc.send("topictest", msg).addCallback(
       new ListenableFutureCallback<SendResult<String, ExecutionDataMessage>>() { 
    @Override 
    public void onSuccess(SendResult<String, ExecutionDataMessage> result) { 
     eresp.status = "ok"; 
     eresp.msg = "message submitted successfully"; 
    } 

    @Override 
    public void onFailure(Throwable ex) { 
     eresp.status = "error"; 
     eresp.msg = "failure while sending data to kafka. exception: " + ex.getMessage(); 
    } 
}); 
HttpStatus erespStatus = eresp.status == "ok" ? HttpStatus.CREATED : HttpStatus.BAD_REQUEST; 
return new ResponseEntity<ExecutionResponse>(eresp, erespStatus); 

回答

0

回調是當你想異步結果。如果您想阻止調用線程,請使用future.get() ...

ListenableFuture<SendResult<String, String>> future = template.send("foo", "bar"); 
try { 
    SendResult<String, String> sendResult = future.get(10, TimeUnit.SECONDS); 
} 
catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    Thread.currentThread.interrupt(); 
} 
catch (ExecutionException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
catch (TimeoutException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+0

感謝加里,會嘗試這種方法。但假設線程當前被阻塞,另一個調用者請求執行方法,spring會創建一個新線程還是會被阻塞? – Alexandre

+0

如果是REST,線程(通常)由Web服務器(例如Tomcat)管理,則每個請求都有自己的線程。該模板是線程安全的。 –

+0

工作就像一個魅力!非常感謝! – Alexandre

0

Kafkaproducer.send返回未來。如果你想等,那麼你可能更喜歡以下內容:

kafkaProduc.send("topictest", msg).get(1L, TimeUnit.SECONDS); 

然後失敗很可能會引發異常而不是調用你的錯誤回調。

+0

這種方法也行得通,感謝James! – Alexandre

相關問題