Продолжение или приостановка и возобновление в API сервлета 3.0 для связи с клиентом?

Мы находимся в процессе миграции двухуровневого приложения Swing в веб-приложение (tomcat, Spring MVC, extJS, если это имеет значение).

Мы нашли такой код в приложении (упрощенный псевдокод Javaesc).

class DoSomethingComplicatedAction extends Action{
    public performAction(..){
        // do lots of stuff here
        // decend about 40 steps in the call stack
        answer = JOptionPane.showConfirmDialog()
        if (answer == something){
            // do something convoluted here
        } else {
            // do something even more convoluted here
        }
}

т.е. в середине некоторой обработки начинается какое-то взаимодействие с пользователем. Очевидно, я не могу сделать это напрямую с помощью сервлета.

Одна вещь, которая могла бы справиться с этим довольно хорошо, - это продолжения. Поэтому я проверил, могу ли я их использовать, и был удивлен, что на самом деле существуют библиотеки, которые позволяют делать такие вещи: Продолжение в Java

При проверке библиотек, упомянутых в этом вопросе, и ответов на него я наткнулся на это утверждение

После завершения спецификации продолжения будут заменены стандартными приостанавливаемыми запросами Servlet-3.0. Доступны ранние выпуски Jetty-7, которые реализуют предлагаемый стандартный API приостановки / возобновления.

Но я не смог найти пример того, как делать что-то подобное с помощью Servlet 3.0 API.

Итак, вопросы:

  1. Можно ли сделать это с помощью API Servlet-3.0 без полного рефакторинга кода, описанного выше, в два или более отдельных действия

  2. Если да, то как? Есть ли какие-то полные примеры для этого или аналогичного варианта использования?

  3. Что мне следует использовать: Continuations или Servlet API? Или, если на это нельзя ответить прямо, от каких условий зависит это решение?


person Jens Schauder    schedule 28.02.2012    source источник


Ответы (2)


Продолжение api, предложенное jetty, было ведущим обходным путем для преодоления ограничений api сервлета в то время. (один запрос, один поток)

Теперь вы должны использовать только Servlet 3.0.

Обратите внимание, что в вашем случае вам может даже не понадобиться делать что-то особенное, потому что действия повторно активны, и вы можете пойти обычным путем ajax.

Добавляю несколько релевантных ссылок:

  1. Ajax, Reverse Ajax
  2. Асинхронные и синхронизирующие сервлеты
  3. Jetty 8.0 и продолжения
person Nicolas Modrzyk    schedule 05.03.2012

Я бы сказал, что более разумным подходом к переносу приложения Swing в веб-приложение было бы использование GWT. Это позволит вам не только делать то, что вы просите, но также обеспечит гораздо более быстрый пользовательский интерфейс, поскольку на клиенте будет происходить больше обработки (то есть без обратных обращений к серверу).

Кроме того, вы сможете повторно использовать большую часть существующего клиентского кода, поскольку GWT в значительной степени является стандартной Java (с некоторыми ограничениями).

person Elias Mårtenson    schedule 05.03.2012