2017-10-08 2 views
4

Lors de l'utilisation de Netbeans et de l'écriture d'un point de terminaison REST arbitraire, NetBeans affiche toujours un avertissement indiquant que la méthode peut être convertie en asynchrone.Est-ce que chaque point de terminaison REST doit être asynchrone dans Java EE?

Par exemple, je crée la méthode suivante:

@GET 
@Path("/test") 
public String hello() { 
    return "Hello World!"; 
} 

NetBeans montre alors un avertissement, voir ci-dessous:

Convert to asynchronous

En cliquant sur l'info-bulle génère ce code:

private final ExecutorService executorService = java.util.concurrent.Executors.newCachedThreadPool(); 

@GET 
@Path(value = "/test") 
public void hello(@Suspended final AsyncResponse asyncResponse) { 
    executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      asyncResponse.resume(doHello()); 
     } 
    }); 
} 

private String doHello() { 
    return "Hello World!"; 
} 

La même chose est vraie lors de la création d'un PUT ou méthode POST. Étant donné que NetBeans affiche toujours un avertissement lorsqu'un noeud final REST est implémenté, cela indique que l'écriture de points de terminaison synchrones est considérée comme incorrecte/mauvaise pratique. Donc, chaque point de terminaison REST devrait-il être asynchrone? Pourquoi?

+0

ce qui se passerait si deux les utilisateurs demandent un accès simultané à la même ressource? –

+0

Pour autant que j'ai compris, le serveur a un certain nombre de threads disponibles dans son pool de threads. Chaque fois qu'une nouvelle requête arrive, le serveur assigne l'un de ses threads à cette requête et libère le thread dans le pool une fois la requête traitée (quelle que soit la ressource à laquelle on accède). Cela signifie également que JAX-RS est thread-safe par défaut. – Jakob

+0

Quelle est votre version de Netbeans? – user7294900

Répondre

1

Par défaut, le traitement de la demande sur le serveur fonctionne dans un mode synchrone , ce qui signifie que chaque demande est traitée dans un seul fil HTTP . Lorsque le traitement de la demande est terminé, le thread est renvoyé à le pool de threads. Ce n'est pas très significatif lorsque l'exécution de la méthode de ressource prend peu de temps et que le nombre de connexions simultanées est relativement peu élevé. En mode asynchrone, le thread est renvoyé au pool de threads avant la fin du traitement de la demande. Le traitement de la demande est ensuite poursuivi dans un autre thread, appelé Worker. Le thread d'E/S libéré peut être utilisé pour accepter les nouvelles demandes entrantes. Dans la plupart des cas, seuls quelques threads peuvent traiter simultanément de nombreuses requêtes , ce qui permet de réduire considérablement le nombre de threads nécessaires pour traiter les demandes entrantes . En utilisant beaucoup moins de threads nous à la fois économiser de la mémoire et améliorer les performances (en réduisant le changement de contexte de fil)

Cela pourrait effacer vous confusion un peu regard bit.Have à ce link

+0

Merci pour la réponse, mais je ne comprends toujours pas complètement. Si je transfère simplement la charge de travail d'un thread HTTP à un thread de travail, cela n'améliore pas les performances si tous les threads de travail sont occupés. Et tant que je n'attends pas d'autres ressources (bases de données, API), les threads de travail doivent être occupés jusqu'à ce que la requête soit terminée. Je ne peux accepter plus de demandes à cause du thread d'E/S, mais cela ne m'aide pas si ces requêtes ne seront pas complétées – Jakob