![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Есть некое банковское приложение, которое мы портируем под веб.
Проблема усложнена отсутствием спецификации и постоянным выходом новых версий толстого клиента. Мы выработали некий алгоритм, который позволяет портировать код, не вникая в его суть (сотни тысяч строк всё-таки). Код толстого клиента устроен так: запрос в бд if (условие) then спросить юзера запрос в бд if (условие) then спросить юзера ... То-есть он может что-то спросить и после ответа продожить работу, а может ничего не спросить. В простых случаях мы разбиваем функцию толстого клиента на два куска в том месте, где запрос. Это позволяет нарисовать веб форму и продолжить с прерванного места. Но есть места с очень сложным ветвлением или когда запрос делается с большой глубины стека вызова. В таких случаях разбиение не помогает. Сегодня появилась мысль: запускать из сервлета вспомогательный тред, в этом треде выполнять всю логику. А сервлет ждет, пока тред не отработает или не захочет спросить что-нибудь у юзера. Если надо спросить, то тред приостанавливается, сервлет возвращает форму, а на submit формы тред возобновляется. Кто сталкивался с чем-нибудь подобным? Есть ли название у такого способа? Есть ли либы для его реализации? Это сообщение отредактировал(а) leniviy - 22.1.2012, 22:46 |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Зачем "вспомогательный тред"? Поток сервлета это сам может делать. Промежуточный результат запроса в БД (из сервлета) должен храниться в сессии пользователя, пока пользователь отвечает на вопрос (если он необходим). |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
COVD, как продолжить со старого места? Переменные можно восстановить из сессии, но состояние потока нельзя.
|
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Что такое "старое место"? Это результат очередного запроса в бд. Обычные данные, которые сервлет может сохранить в сессии, если для продолжения требуется уточнение пользователя.
Разве толстый клиент задает вопросы пользователю не после завершения запроса, а в цикле извлечения данных из ResultSet? Типа, "Многовато данных запрос выдает - продолжить или отменить?" Это реализация pagination, постраничного вывода информации? PS Приведенный сценарий
выглядит как последовательность завершенных запросов, между которыми возможны паузы на общение с пользователем. Это сообщение отредактировал(а) COVD - 23.1.2012, 14:52 |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
на самом деле всё сложнее:
как вернуться в b(), да ещё так, чтобы по выходу она вернулась в a() и вызвала d()? А если b() вызвана из другой функции? Короче, мне тут подсказали, что это называется continuations , и что есть те, которые не создают потоков, а вместо этого модифицируют байткод, чтобы контекст потоко можно было сохранить и восстановить. http://www.artima.com/lejava/articles/continuations.html Там же написано, что в Jetty есть недо-continuations на тредах. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Ужос. fetch ... into - это аналог next() в ResultSet? На мой взгляд правильнее разбить запрос на несколько запросов. Чтобы не держать соединение с базой и не блокировать таблицы пока пользователь думает над ответом. Тогда это органично впишется в J2EE. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |