Saniyede çok sayıda istek alabilen API oluşturma konusunda çalışıyorum ve bazı talepler çok fazla hesaplama gerektirebilir (karmaşık raporlar). Kavram kanıtı olarak küçük bir prototip oluşturmam istendi. JAX-RS uygulamam olarak Jersey ile Spring Boot kullanıyorum. Geçmişte Spring MVC ile böyle bir şey yaptım. Spring + Jersey kullanarak Async API'si
@RequestMapping(value = "/dashboard", method = RequestMethod.GET)
public DeferredResult<String> showDashboard(Model model) {
DeferredResult<String> result = new DeferredResult<>();
model.addAttribute("testObj", new User());
result.setResult("home/dashboard");
return result;
}
Jersey'deki ile bu denenmiş ve işe görünüyor veya en azından bir hata atmadım.
@GET
public DeferredResult<String> getClients() {
DeferredResult<String> deferredResult = new DeferredResult<>();
deferredResult.setResult("Nothing! But I'm Async!");
return deferredResult;
}
Ancak, Jersey'de senkronize olmayan işlemleri ele almak için gördüğüm tüm örnekler şunun gibi görünüyor.
Produces(MediaType.TEXT_PLAIN)
public void get(@Suspended final AsyncResponse response) {
// This call does not block.
client.callExternalService(
// This callback is invoked after the external service responds.
new Callback<string>() {
public void callback(String result) {
response.resume("Result: " + result + ".n");
}
});
}
Asıl sorum ise, bu üç kod parçacığı arasındaki farkın, eğer varsa, sahnenin arkasındaki farktır. Bunların hepsi aynı şeyi gerçekleştirecek mi?
Uyumsuzluğu başarmanın daha iyi bir yolu var mı? Ayrıca, Java’da Geleceğin kullanımını da gördüm, ama hiç kullanmadım.
GÜNCELLEME:
tüm çalışma benim Jersey Kontrolörü aşağıdaki kodu var.
@GET
public String getClients() {
return "Nothing, I'm Sync!";
}
@GET
@Path("/deferred")
public DeferredResult<String> getClientsAsync() {
DeferredResult<String> deferredResult = new DeferredResult<>();
deferredResult.setResult("Nothing! But I'm Async!");
return deferredResult;
}
@GET
@Path("/async")
public void getClientsJAXRSAsync(@Suspended AsyncResponse response) {
new Thread(() -> {
response.resume("I am Async too! But I am using @Suspended");
}).start();
}
Ana soruma geri dönersek, bunlar arasındaki fark nedir? Benim Anlıyorum DeferredResult bir Spring şey bu yüzden Jersey + Spring kullanıyorum rağmen, Jersey ile kullanım için uygun olup olmadığından emin değilim.
Bu benim gönderdiğim sorulardan biridir. Bir göz atın ... http://stackoverflow.com/questions/29563475/null-pointer-exception-in-resteasy-asynchronous-request NOT: Ben hala önerilen cevabın çalışıp çalışmadığını test etmedim .. –