Продолжения или приостановка и возобновление в Servlet 3.0 API для связи с клиентом? - PullRequest
3 голосов
/ 28 февраля 2012

Мы находимся в процессе миграции двухуровневого приложения 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? Или, если на этот вопрос нельзя ответить напрямую, от каких условий зависит это решение?

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

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

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

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

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

  1. Ajax, обратный Ajax
  2. Async vs sync servlets
  3. Причал 8.0 и продолжения
0 голосов
/ 05 марта 2012

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

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

...