Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> user input в случайных местах бизнес кода, портирую толстый клиент на веб 
:(
    Опции темы
leniviy
Дата 22.1.2012, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



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

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

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

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

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


Это сообщение отредактировал(а) leniviy - 22.1.2012, 22:46
PM MAIL   Вверх
COVD
Дата 23.1.2012, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

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

Зачем "вспомогательный тред"? Поток сервлета это сам может делать. Промежуточный результат запроса в БД (из сервлета) должен храниться в сессии пользователя, пока пользователь отвечает на вопрос (если он необходим). 
PM MAIL   Вверх
leniviy
Дата 23.1.2012, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



COVD, как продолжить со старого места? Переменные можно восстановить из сессии, но состояние потока нельзя.
PM MAIL   Вверх
COVD
Дата 23.1.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



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

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

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

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

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

Это сообщение отредактировал(а) COVD - 23.1.2012, 14:52
PM MAIL   Вверх
leniviy
Дата 23.1.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



на самом деле всё сложнее:
Код

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 на тредах.

PM MAIL   Вверх
COVD
Дата 23.1.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

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

Ужос.
fetch ... into - это аналог next() в ResultSet? 
На мой взгляд правильнее разбить запрос на несколько запросов. Чтобы не держать соединение с базой и не блокировать таблицы пока пользователь думает над ответом. Тогда это органично впишется в J2EE.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.