Могу ли я сделать потоковые/обрабатывающие запросы Java HttpServer параллельно?

Я построил простой HttpServer, следуя руководствам, которые я нашел в Интернете, используя облегченный HttpServer от Sun.

В основном основная функция выглядит так:

public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        //Create the context for the server.
        server.createContext("/", new BaseHandler());

        server.setExecutor(null); // creates a default executor
        server.start();
    }

И я реализовал метод интерфейса BaseHandler для обработки запроса Http и возврата ответа.

static class BaseHandler implements HttpHandler {
        //Handler method
        public void handle(HttpExchange t) throws IOException {

          //Implementation of http request processing
          //Read the request, get the parameters and print them
          //in the console, then build a response and send it back.
        }
  }

Я также создал клиент, который отправляет несколько запросов через потоки. Каждый поток отправляет на сервер следующий запрос:

http://localhost:8000/[context]?int="+threadID

При каждом запуске клиента запросы поступают на сервер в разном порядке, но они обслуживаются последовательно.

Я хочу добиться того, чтобы запросы обрабатывались параллельно, если это возможно.

Можно ли, например, запускать каждый обработчик в отдельном потоке, и если да, то стоит ли это делать.

Или мне следует вообще отказаться от легковесного сервера Sun и сосредоточиться на создании чего-то с нуля?

Спасибо за любую помощь.


person Humunculus84    schedule 06.02.2013    source источник
comment
Это то, что HttpServer уже делает.   -  person user207421    schedule 06.02.2013
comment
Это делается путем установки исполнителя, см. docs.oracle.com/javase/6/docs/api/java/util/concurrent/   -  person Esailija    schedule 06.02.2013
comment
Если это не учебный проект, я бы порекомендовал обратить внимание на такие библиотеки, как Apache Mina или Нетти.   -  person Perception    schedule 06.02.2013
comment
Спасибо всем за быстрые ответы! Я рассмотрю это как можно скорее.   -  person Humunculus84    schedule 06.02.2013


Ответы (2)


Как видно из ServerImpl, по умолчанию исполнитель просто «запускает» задачу:

  157       private static class DefaultExecutor implements Executor {
  158           public void execute (Runnable task) {
  159               task.run();
  160           }
  161       }

вы должны предоставить реального исполнителя для вашего httpServer, например:

server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool());

и ваш сервер будет работать параллельно. Осторожно, это Executor без ограничений, см. Executors.newFixedThreadPool, чтобы ограничить количество потоков.

person twillouer    schedule 06.02.2013
comment
Спасибо вам за быстрый ответ. Я посмотрю больше на исполнителей и посмотрю, смогу ли я лучше понять :) - person Humunculus84; 06.02.2013
comment
Однако быстрый вопрос: исполнитель теперь в каком-то смысле заменяет обработчик или это что-то другое? - person Humunculus84; 06.02.2013
comment
нет, только способ служить задаче. С помощью newCahdedThreadPool() будет создано столько потоков, сколько требуется. Но ваш обработчик будет вызываться как обычно. Будьте осторожны, если вы повторно используете один и тот же обработчик, он должен быть ThreadSafe. - person twillouer; 06.02.2013
comment
Похоже, он отлично работает с newFixedThreadPool, но мне нужно больше узнать об исполнителях. Большое спасибо за ответ! - person Humunculus84; 06.02.2013
comment
@twillouer Этот сервер синхронный или асинхронный? Поскольку Http является синхронным, я хочу знать, как ведет себя этот сервер. - person SGuru; 23.03.2016
comment
@Hoysala сервер синхронный: он слушает порт, принимает сокет и запускает новый поток - person twillouer; 31.03.2016

Вы использовали server.setExecutor(null), который запускает обработчик в том же потоке вызывающего объекта. В этом случае основной поток, который запускает сервер.

Вам нужно только изменить строку как

public static void main(String[] args) throws Exception {

    HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
    //Create the context for the server.
    server.createContext("/", new BaseHandler());
    server.setExecutor(Executors.newCachedThreadPool());
    server.start();
}
person user3322581    schedule 25.02.2019