Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > user input в случайных местах бизнес кода


Автор: leniviy 22.1.2012, 22:42
Есть некое банковское приложение, которое мы портируем под веб.
Проблема усложнена отсутствием спецификации и постоянным выходом новых версий толстого клиента. Мы выработали некий алгоритм, который позволяет портировать код, не вникая в его суть (сотни тысяч строк всё-таки).

Код толстого клиента устроен так:
запрос в бд
if (условие) then спросить юзера
запрос в бд
if (условие) then спросить юзера
...

То-есть он может что-то спросить и после ответа продожить работу, а может ничего не спросить.
В простых случаях мы разбиваем функцию толстого клиента на два куска в том месте, где запрос. Это позволяет нарисовать веб форму и продолжить с прерванного места.
Но есть места с очень сложным ветвлением или когда запрос делается с большой глубины стека вызова. В таких случаях разбиение не помогает.

Сегодня появилась мысль: запускать из сервлета вспомогательный тред, в этом треде выполнять всю логику. А сервлет ждет, пока тред не отработает или не захочет спросить что-нибудь у юзера. Если надо спросить, то тред приостанавливается, сервлет возвращает форму, а на submit формы тред возобновляется.

Кто сталкивался с чем-нибудь подобным? Есть ли название у такого способа? Есть ли либы для его реализации?

Автор: COVD 23.1.2012, 03:07
Цитата

Сегодня появилась мысль: запускать из сервлета вспомогательный тред, в этом треде выполнять всю логику. А сервлет ждет, пока тред не отработает или не захочет спросить что-нибудь у юзера. Если надо спросить, то тред приостанавливается, сервлет возвращает форму, а на submit формы тред возобновляется.

Зачем "вспомогательный тред"? Поток сервлета это сам может делать. Промежуточный результат запроса в БД (из сервлета) должен храниться в сессии пользователя, пока пользователь отвечает на вопрос (если он необходим). 

Автор: leniviy 23.1.2012, 10:42
COVD, как продолжить со старого места? Переменные можно восстановить из сессии, но состояние потока нельзя.

Автор: COVD 23.1.2012, 13:56
Что такое "старое место"? Это результат очередного запроса в бд. Обычные данные, которые сервлет может сохранить в сессии, если для продолжения требуется уточнение пользователя.  

Разве толстый клиент задает вопросы пользователю не после завершения запроса, а в цикле извлечения данных из ResultSet? Типа, "Многовато данных запрос выдает - продолжить или отменить?" Это реализация pagination, постраничного вывода информации?

PS 
Приведенный сценарий
Цитата

запрос в бд
if (условие) then спросить юзера
запрос в бд
if (условие) then спросить юзера

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

Автор: leniviy 23.1.2012, 14:53
на самом деле всё сложнее:
Код

function a() 
    int i;
    fetch ... into :i;
    if i > 0 then
      b()
    end if
    d()
end function

function b() 
    int j;
    fetch ... into :j;
    if j = 1 then
      nQuest = e.mer_mes('Вопрос','Графики по срочному обязательству уже введены. Удалить графики и создать новые?','Question', 'Да;Нет')
      if nQuest = 1 then
        c();
      end if
    end if
    e()
end function
...


как вернуться в b(), да ещё так, чтобы по выходу она вернулась в a() и вызвала d()? 
А если b() вызвана из другой функции?

Короче, мне тут подсказали, что это называется continuations , и что есть те, которые не создают потоков, а вместо этого модифицируют байткод, чтобы контекст потоко можно было сохранить и восстановить.
http://www.artima.com/lejava/articles/continuations.html

Там же написано, что в Jetty есть недо-continuations на тредах.

Автор: COVD 23.1.2012, 16:05
Цитата

вместо этого модифицируют байткод

Ужос.
fetch ... into - это аналог next() в ResultSet? 
На мой взгляд правильнее разбить запрос на несколько запросов. Чтобы не держать соединение с базой и не блокировать таблицы пока пользователь думает над ответом. Тогда это органично впишется в J2EE.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)