2015-07-09 8 views
7

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.

+0

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 .. –

cevap

-3

Anlayışınız oldukça doğru. Aynı işi yapıyorlar. Ancak uygulamalar farklı. DeferredResult bahar uygulamasıdır. Ve kod dosyanızda çoğu bölüm JAX-RS uygulamasında. Yumruk servisinden yanıt aldığınızdan emin değilim.

Ancak benim görüşüme göre ya bahar dersleri ya da JAX-RS kullanıyorsunuz. Ama ikisi de aynı yöntemle değil.

+0

İlk iki yöntem Eşzamansız değil, bunlar istemci tarafında eşzamansız olabilir (istek ayarlarının türüne bağlı olarak), ancak yöntem, yürütme işlemini tamamlayana kadar arka uçta tam olarak senkronize olur. Yayımlanan OP'in üçüncü yöntemi, Gerçek Sunucu tarafı Asenkron işleminin bir örneğidir. –