2017-06-17 5 views
1

Je ne peux pas obtenir l'exemple Undertow très basique pour fonctionner comme prévu. Le code suivant doit permettre aux demandes HTTP simultanées d'être servies. Ce qui se passe en réalité, c'est qu'une seule demande est traitée et qu'aucune autre demande ne peut être traitée tant que la première n'est pas terminée.Les opérations de blocage de sous-dépotage avec dispatch ne fonctionnent pas

public class MainUT { 

    public static void main(String[] args) { 
     Undertow.builder()              
      .addHttpListener(8080, "localhost")          
      .setHandler(new HttpHandler() {             
       @Override 
       public void handleRequest(final HttpServerExchange exchange) 
              throws Exception { 
        if(exchange.isInIoThread()){ 
         exchange.dispatch(this); 
         return; 
        } 
        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); 
        exchange.getResponseSender().send("Hello World");    
       } 
      }).build().start(); 
    } 
} 

Que manque-t-il?

J'ai utilisé Chrome pour effectuer une requête GET et j'ai mis le débogueur en veille après l'envoi de la demande. Puis émis une commande curl

curl http://localhost:8080 

La commande boucle retourne seulement après la demande Chrome est complètement servi.

Je le test sur les deux HTTP et HTTPS auditeurs. Augmenter le nombre de threads XNIO et leurs travailleurs ne change rien. Un XNIO aléatoire est affecté à la demande. Ensuite, un travailleur aléatoire est affecté après l'envoi. Le serveur reste bloqué jusqu'à ce que la demande soit servie.

+0

Votre code a l'air correct. Des erreurs? Comportement? Comment l'avez-vous testé? Quel est votre client HTTP? – Azeem

+0

Aucune erreur. Lors de l'émission d'une requête GET à partir de Chrome, toutes les autres demandes sont bloquées jusqu'à la fin. –

+0

Votre navigateur est-il occupé? Comment êtes-vous des demandes simultanées? – Azeem

Répondre

1

Vous code semble ok mais en regardant BlockingHandler essayez ce qui suit ou utilisez BlockingHandler directement.

exchange.startBlocking(); 
if (exchange.isInIoThread()) { 
    exchange.dispatch(handler); 
} else { 
    handler.handleRequest(exchange); 
} 

Pour un moyen facile de la chaîne HttpHandlers regarder MiddlewareBuilder. J'essaierais également de configurer le gestionnaire de consignation d'accès afin que vous puissiez voir ce qui se passe et quel thread gère chaque requête.

+0

Salut Bill, merci pour la réponse. J'avais déjà essayé 'BlockingHandler' Ça ne marchait pas aussi bien. Je peux voir que la demande est traitée par un autre thread mais le serveur entier n'est pas capable d'accepter plus de demandes. Je vais suivre vos autres suggestions. –

+0

Pourriez-vous donner l'exemple exact qui ne fonctionne pas? Utilisez-vous un sommeil ou quelque chose comme ça pour tester? –

+0

Si vous utilisez le débogueur dans l'EDI, ne met-il pas les deux threads en pause au même point? Vous faire croire que c'est en attente, mais vraiment les deux threads viennent frapper l'instruction de débogage. –