Java-аналог C # APM / IHttpAsyncHandler - PullRequest
2 голосов
/ 16 февраля 2011

Я реализовал асинхронную обработку http-запросов в C # с помощью модели асинхронного программирования .Net через IHttpAsyncHandler.

Я новичок в Java, но хочу достичь того же конца - начать запрос, передать ему поток обработки запросов и обработать его асинхронно, сигнализировать о завершении всей обработки, вызывая обратный вызов запроса завершения обработчика и запись результата обработки в поток ответов.

Я уверен, что это должно существовать, и мне не нужно накатывать собственное решение, но поиск асинхронной обработки http приводит только к AJAX-ориентированным решениям (я хочу асинхронную обработку на стороне сервера).

Есть ли в Java аналог IHttpAsyncHandler?

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Java Servlet 3.0 добавляет асинхронную поддержку, аналогичную ASP.NET.

http://blogs.oracle.com/enterprisetechtips/entry/asynchronous_support_in_servlet_3

Поддержка доступна в более новых версиях контейнеров сервлетов, таких как Tomcat 7.0.

0 голосов
/ 16 февраля 2011

В Java-сервлетах каждый запрос получает свой собственный поток и не ограничивает обработку других запросов. Итак, в принципе они уже асинхронны: http://www.codestyle.org/java/servlets/faq-Threads.shtml

AFAIK, IHttpAsyncHandler в .Net должен быть более производительным, но не все согласны: http://geekswithblogs.net/SanjayU/archive/2009/01/06/ihttphandler-vs-ihttpasynchandler.aspx

Обновление:

Чтобы запустить несколько параллельных задач и дождаться их завершения, лучше всего использовать ExecutorService. Вы можете сделать что-то подобное в вашем методе сервлета:

    ExecutorService executor = Executors.newCachedThreadPool(numThreads);
    for (int i = 0; i < numParallelTasks; i++) {
        Runnable worker = new MyRunnable();
        executor.execute(worker);
    }
    // This will make the executor accept no new threads
    // and finish all existing threads in the queue
    executor.shutdown();
    // Wait until all threads are finish
    while (!executor.isTerminated()) {

    }
    // all tasks done
...