2015-12-21 3 views
1

У меня есть следующий фрагмент кода, чтобы сделать мой HttpServer многопоточным, но он все еще работает как один threaded. Можете ли вы мне помочь? Я использую Java HTTPServer API:Не удалось сделать мой Http-сервер многопоточным? Я использую API Java HttpServer

// Bind to port 8083 
httpServer = HttpServer.create(new InetSocketAddress(HTTP_PORT), 0); 

// Adding '/send' context 
httpServer.createContext("/send", new SendHandler()); 

ExecutorService executor = Executors.newCachedThreadPool(); 
httpServer.setExecutor(executor); 

// Start the server 
httpServer.start(); 

Полный Java Класс:

public class GCMMockServer { 

    static HttpServer httpServer; 
    static final int HTTP_PORT = 8083; 

    public static void main(String[] args) { 
     GCMMockServer.start(); 
    } 

    public static void start() { 
     try { 
      // Bind to port 8083 
      httpServer = HttpServer.create(new InetSocketAddress(HTTP_PORT), 0); 

      // Adding '/send' context 
      httpServer.createContext("/send", new SendHandler()); 

      ExecutorService executor = Executors.newCachedThreadPool(); 
      httpServer.setExecutor(executor); 

      // Start the server 
      httpServer.start(); 

      System.out.println("GCM Mock Server started at (localhost,8083)"); 
     } catch (IOException ex) { 
      Logger.getLogger(GCMMockServer.class.getName()).log(Level.SEVERE, 
        null, ex); 
     } 
    } 

    public static void stop() { 
     httpServer.stop(5); 
    } 

    // Handler for '/send' context 
    static class SendHandler implements HttpHandler { 

     @Override 
     public void handle(HttpExchange he) throws IOException { 
      System.out.println("Serving the request"); 

      // Serve for POST requests only 
      if (he.getRequestMethod().equalsIgnoreCase("POST")) { 

       try { 
        // REQUEST Headers 
        Headers requestHeaders = he.getRequestHeaders(); 
        Set<Map.Entry<String, List<String>>> entries = requestHeaders 
          .entrySet(); 

        System.out.println("Inside POST method"); 

        int contentLength = Integer.parseInt(requestHeaders 
          .getFirst("Content-length")); 
        List<String> contentTypes = null; 

        for (Iterator<Entry<String, List<String>>> iterator = entries 
          .iterator(); iterator.hasNext();) { 
         Entry<String, List<String>> entry = iterator.next(); 
         String key = entry.getKey(); 
         System.out.println("Key : " + key + ", values : "); 
         if (key.equalsIgnoreCase("Content-type")) { 
          contentTypes = entry.getValue(); 
         } 
         for (Iterator<String> iterator2 = entry.getValue() 
           .iterator(); iterator2.hasNext();) { 
          String value = iterator2.next(); 
          System.out.println("-----------" + value); 
         } 
        } 

        System.out.println("Content length : " + contentLength); 

        // REQUEST Body 
        InputStream is = he.getRequestBody(); 

        if (contentTypes.contains("application/json")) { 

         InputStreamReader isr = new InputStreamReader(is, 
           "utf-8"); 
         BufferedReader br = new BufferedReader(isr); 

         // From now on, the right way of moving from bytes to 
         // utf-8 characters: 

         int b; 
         StringBuilder buf = new StringBuilder(512); 
         while ((b = br.read()) != -1) { 
          buf.append((char) b); 
         } 

         JSONObject req = new JSONObject(buf.toString()); 
         System.out.println("Request body : " + req); 
         String to = (String) req.get("to"); 
         String message = (String) ((JSONObject) req.get("data")) 
           .get("message"); 
         System.out.println("Request message : " + message 
           + ", to : " + to); 
        } 

        // RESPONSE Headers 
        Headers responseHeaders = he.getResponseHeaders(); 
        System.out.println("Response Headers : " 
          + responseHeaders.toString()); 

        String response = "Message received"; 
        // Send RESPONSE Headers 
        he.sendResponseHeaders(HttpURLConnection.HTTP_OK, 
          response.length()); 

        // RESPONSE Body 
        OutputStream os = he.getResponseBody(); 

        os.write(response.getBytes()); 

        is.close(); 
        os.flush(); 
        os.close(); 
        he.close(); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else if (he.getRequestMethod().equalsIgnoreCase("GET")) { 
       System.out.println("Nothing to serve in GET request type"); 

       // RESPONSE Headers 
       Headers responseHeaders = he.getResponseHeaders(); 
       String response = "Hi This is Sandeep"; 
       System.out.println("Response Headers : " 
         + responseHeaders.toString()); 

       // Send RESPONSE Headers 
       he.sendResponseHeaders(HttpURLConnection.HTTP_OK, 
         response.length()); 

       // RESPONSE Body 
       OutputStream os = he.getResponseBody(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 

       osw.write(response); 

       // is.close(); 
       osw.close(); 
       os.close(); 
       he.close(); 
      } 

     } 
    } 
} 
+1

Как вы думаете, это только один? Cah вы делитесь SendHandler? Вы печатаете в нем имя потока? Как вы это протестируете? – Jan

+0

Вот мой весь файл Java: –

+0

, пожалуйста, отредактируйте ваш вопрос, не публикуйте в комментарии – Jan

ответ

1

Рассмотрим изменение начало вашего handle метода:

@Override 
public void handle(HttpExchange he) throws IOException { 
    System.out.println("Serving the request from Thread " 
      + Thread.currentThread().getName() + "/" 
      + Thread.currentThread().getId()); 
    try { 
     Thread.sleep(5000); 
    } catch(InterruptedException ie) { 
     ie.printStackTrace(); 
     return; 
    } 
    System.out.println("Continue request in Thread " 
      + Thread.currentThread().getName() + "/" 
      + Thread.currentThread().getId()); 

Теперь запустите сервер, откройте браузер, загрузите свой URL-адрес, обновите твиз в течение 5 секунд и просмотрите журнал консоли.

У меня такое чувство, что вы будете видеть несколько потоков просто отлично.

Что касается теста:

Test вы используете однопоточенfor -loop). Таким образом, будет только один активный вызов вашего сервлета на каждый раз. Поскольку следующая итерация вашего цикла for начнется только после завершения последнего, предыдущий поток в пуле потоков исполнителей был переработан. Там просто было нет необходимости для mutlithreading на основе вашего теста.

+0

Большое спасибо @Jan за ответ с примером, чтобы проверить также. И спасибо всем остальным за ответы. Да для моего тестового примера нет необходимости многопоточности. Я пишу тестовый пример, где будет несколько запросов из нескольких запущенных потоков, вызывающих этот HttpServer. –

+0

Изобразительное. Всякий раз, когда вы готовы, было бы хорошо, если бы вы приняли ответ на свой вопрос. – Jan

+0

Done.Sorry Я забыл об этом. –