|
|
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Доброго здравия, дорогие коллеги. Есть такая задача: имеется страница основанная на темплейте с кнопочками, по нажатию на кнопку выполняется коннект и прочие операции с удаленным сервером через ssh. Для корректного отображения процесса, хочется по нажатию этой же кнопочки, получать запуск и останов ProgressIndicator-а, но... все примеры, связанные с данным функционалом основаны на работе двух кнопочек "Старт" и "Стоп" - с ними все отлично работает. А вот с одной кнопкой никак, например, наипростейший вариант - запускать попап с прогрессом и закрывать его при выполнении процесса, оставляю в екшн методе кнопки запуск попапа и выполнение скрипта. Он запускается, ничего не делает какое-то время(кнопка в это врмя в состоянии недоступно), потом попап с прогрессом и сообщение лога выводятся вместе. Я так понимаю, все что в экшен листенере кнопки выполняется в одном потоке и поэтому получить результат отдельно нельзя. Пробовала запускать попап через клиент листенер с помощью JavaScript, он и не ругается, но и ничего не делает, возможно, из-за того, что это темплейт и бины не видят друг-друга(не знаю как это еще объяснить). В общем, кто как выходил из этой ситуации? Использую JDev 11gR2 Как всегда, благодарна идеям :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 19:37:37 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Ничего не понял :). Если с двумя кнопочками всё работает, то непонятно, какая проблема переделать для одной кнопки? В чём именно затык? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 10:55:25 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
P.S. Если вы хотите видеть прогресс выполнения длинной операции и возможность её прервать вам не обойтись без создания нового потока, в котором будет эта операция выполняться. А на view достаточно будет добавить компонент poll, который будет обновлять состояние progress indicator. Это если я всё правильно понял :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 11:54:33 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX777Это если я всё правильно понял :) не совсем MOHAX777В чём именно затык? в том, что эти два процесса: отображение прогресса и сам процесс на сервере, выполняются в одном потоке, и получается, что как результат я получаю все скопом на выходе из екшн. листенера. Поэтому их нужно как-то разграничить, мне подсказали 2 варианта: выделить выполнение процесса в отдельный поток, либо запускать его не по екшн листенеру кнопки, а по клиент листенеру, а по экшн листенеру отображение процесса ганять. Попробую для начала 2й вариант, с разграничение потоков пока работать не приходилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2013, 12:52:33 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana Palunв том, что эти два процесса: отображение прогресса и сам процесс на сервере, выполняются в одном потоке, и получается, что как результат я получаю все скопом на выходе из екшн. листенера. Поэтому их нужно как-то разграничить, мне подсказали 2 варианта: выделить выполнение процесса в отдельный поток, либо запускать его не по екшн листенеру кнопки, а по клиент листенеру, а по экшн листенеру отображение процесса ганять. Попробую для начала 2й вариант, с разграничение потоков пока работать не приходилось. Про первый вариант я вам в p.s. как раз и описал, а вот про второй вариант у меня сильные сомнения, что такое вообще возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2013, 11:10:17 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX777Про первый вариант я вам в p.s. как раз и описал, а вот про второй вариант у меня сильные сомнения, что такое вообще возможно. попробовала, возможно, но не в моем случае. Т.к. у меня на клиенте работа с радиоБаттонами, приходится сетить переменные, а вызов по клиентлистенеру все переменные обнуляет. Так шо "факир был пьян и фокус неудался", выделила выполнение скрипта в отдельный поток, все отрабатывает, НО, мне нужно выводить лог этого скрипта в виде сообщения на клиент, а FacesContext из потока не виден. Передать его в бин никак не могу, поскольку информация по процессу умирает вместе с потоком... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2013, 12:02:43 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana Palun, Используйте poll, в котором берите текст из потока и выводите на экран. Не вижу проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 12:28:53 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX777Oksana Palun, Используйте poll, в котором берите текст из потока и выводите на экран. Не вижу проблем. 13774749 и ниже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 12:36:12 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
BlazkowiczMOHAX777Oksana Palun, Используйте poll, в котором берите текст из потока и выводите на экран. Не вижу проблем. 13774749 и ниже. метод poll будет видеть facecontext, поэтому туда можно будет вывести лог из потока операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 13:29:32 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX777метод poll будет видеть facecontext, поэтому туда можно будет вывести лог из потока операции. Так у Oksana Palun проблема в том что она не может передать данные из контекста запроса\ответа в асинхронную задачу и из асинхронной задачи обратно в контекста запроса\ответа. Вместо того чтобы получить данные из facecontext и положить в асинхронную задачу, пытается использовать facecontext в самой асинхронной задаче. Опять же все эти пляски со своими потоками в JEE вообще не рекомендуются без JMS. Тем более, если опыта работы с многопоточностью минимум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 13:33:07 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX777метод poll будет видеть facecontext, поэтому туда можно будет вывести лог из потока операции. И ещё не понятно куда буферизировать лог до того как следующий poll пришел. А если он ещё и жирный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 13:34:01 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
BlazkowiczMOHAX777метод poll будет видеть facecontext, поэтому туда можно будет вывести лог из потока операции. Так у Oksana Palun проблема в том что она не может передать данные из контекста запроса\ответа в асинхронную задачу и из асинхронной задачи обратно в контекста запроса\ответа. Вместо того чтобы получить данные из facecontext и положить в асинхронную задачу, пытается использовать facecontext в самой асинхронной задаче. Опять же все эти пляски со своими потоками в JEE вообще не рекомендуются без JMS. Тем более, если опыта работы с многопоточностью минимум. Я делала и так и так. С пулом не сложилось, потому, что метод, который нужно вызывать в пуле, вызывается из бина, где инициализированы переменные, которые устанавливаются на клиенте. При срабатывании пула, они обнуляются, где это настраивается, если настраивается, я не нашла. Поэтому перешла к варианту с потоками, "Вместо того чтобы получить данные из facecontext и положить в асинхронную задачу" в поток я данные с клиента передаю, но задача в потоке возвращает лог, это совсем другие данные, которые нужно вернуть в facecontext. Ожидать этот лог, в клиентском бине, смысле не имеет, это будет то же самое, что и просто выполнение процесса по кнопке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 13:45:44 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunЯ делала и так и так. Как и как? Oksana PalunС пулом не сложилось, потому, что метод, который нужно вызывать в пуле, вызывается из бина, где инициализированы переменные, которые устанавливаются на клиенте. При срабатывании пула, они обнуляются, где это настраивается, если настраивается, я не нашла. Поэтому перешла к варианту с потоками, Что такое "пул" в вашем понимании в этой теме, по-моему ещё никто не понял. Вы pool и poll часом не путаете? Oksana Palun"Вместо того чтобы получить данные из facecontext и положить в асинхронную задачу" в поток я данные с клиента передаю, Вы не можете прямо с "клиента" передать данные в поток. Клиент отправляет данные на сервер, и этот запрос уже обрабатывается в контексте JSF. А там вы собираете данные из запроса и помещаета в "свой поток". Вы бы уже, что ли, код показали. Потому что в вашей персональной терминологии, разобратся сложно. Oksana Palunно задача в потоке возвращает лог, это совсем другие данные, Мы и не ожидали что это будут "те же самые данные". Oksana Palunкоторые нужно вернуть в facecontext. Данные нужно сложить куда-то и замапить на id юзера\клиента\задачи\сессии. А потом когда запрос придёт ещё раз с клиента (если реализовать poll). Найти лог по id и вернуть. Oksana PalunОжидать этот лог, в клиентском бине, смысле не имеет, это будет то же самое, что и просто выполнение процесса по кнопке. Что такое "клиентский бин"? Не нужно ничего "ожидать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 13:56:55 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunЯ делала и так и так. С пулом не сложилось, потому, что метод, который нужно вызывать в пуле, вызывается из бина, где инициализированы переменные, которые устанавливаются на клиенте. При срабатывании пула, они обнуляются, где это настраивается, если настраивается, я не нашла. Поэтому перешла к варианту с потоками Вы как-то странно рассматриваете задачу, потоки и poll не должны расматриваться как "или то или другое". В данном случае они работают вместе: 1. По нажатии на кнопку "Пуск" создаётся поток, который сохраняется в application scope с привязкой к пользователю. В этом потоке есть метод, который отдаёт текущий лог. 2. Запускается poll с нужным интервалом, при этом в методе этого poll берётся нужный поток и вызывается метод, который возвращает лог. Этот лог выводим на экран. В случае, если поток завершил работу, то "дизэйблим" poll и "чистим" поток. Проблемы: 1. если приложение валиться, то задачи мрут, если нужно их сохранение, то имеет смысл задействовать БД для хранения задач. 2. Необходимо чистить сохранённые в application scope потоки, если пользователь вышел/отвалился до завершения задачи. Впрочем, его CG может автоматом убрать, но тогда надо думать, где сохранять лог операции. Может, уважаемый Blazkowicz прояснит этот момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:38:37 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX7771. если приложение валиться, то задачи мрут, если нужно их сохранение, то имеет смысл задействовать БД для хранения задач. В этом случае имеет смысл сразу брать JMS или любую готовую MQ. Городить очереди в базе, это уже попахивает лисопедом. MOHAX7772. Необходимо чистить сохранённые в application scope потоки, если пользователь вышел/отвалился до завершения задачи. Сервер точно не может знать когда юзер отвалился, разве что если сессия явно инвалидирована. Если асинхронная задача имеет цикличность, то, да. Можно в цикле проверять валидность сессии. Но, как я понимаю, из постановки задачи в данном случае там запускается какой-то тормозной скрипт, поэтому прервать его получится вряд ли. Разве что если оно понимает Thread.interrupt() нормально. Т.е. это нужно смотреть на то какая конкретно там задача решается асинхронно. Можно её прибить или нет. MOHAX777Впрочем, его CG может автоматом убрать, но тогда надо думать, где сохранять лог операции. Вот именно поэтому для данной задачи, я бы использовал COMET/Long Polling, чтобы лог незамедлительно слать клиенту. Нечего его на сервере хранить и потом ещё не известно когда чистить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:45:59 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
MOHAX7771. По нажатии на кнопку "Пуск" создаётся поток, который сохраняется в application scope с привязкой к пользователю. В этом потоке есть метод, который отдаёт текущий лог. 2. Запускается poll с нужным интервалом, при этом в методе этого poll берётся нужный поток и вызывается метод, который возвращает лог. Этот лог выводим на экран. В случае, если поток завершил работу, то "дизэйблим" poll и "чистим" поток. А можете мне про этот метод рассказать подробнее? Я создала поток, по пулу пытаюсь его найти, из видимых мне, на данный момент способов, это список StackTraces у Thread, он его видит, но ничего считать я не могу. MOHAX777Проблемы: 1. если приложение валиться, то задачи мрут, если нужно их сохранение, то имеет смысл задействовать БД для хранения задач. 2. Необходимо чистить сохранённые в application scope потоки, если пользователь вышел/отвалился до завершения задачи. Впрочем, его CG может автоматом убрать, но тогда надо думать, где сохранять лог операции. Может, уважаемый Blazkowicz прояснит этот момент. Про отвалы мне уже говорили, пока даже и не думала, об этом. Будем решать проблемы по мере их поступления, задача вроде не должна отрабатывать дольше 10ти минут, а за это время он не валится. И кстати, есть ли в ADF возможность управления временем жизни сессий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:46:29 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТ.е. это нужно смотреть на то какая конкретно там задача решается асинхронно. Можно её прибить или нет. Поднятие/останов инстансов на линуксовом сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:48:34 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunА можете мне про этот метод рассказать подробнее? Я создала поток, по пулу пытаюсь его найти, из видимых мне, на данный момент способов, это список StackTraces у Thread, он его видит, но ничего считать я не могу. Извините но с каждым новым вашим сообщением возникает все большее желание поставить смайлик фейспалм. Ваша терминология просто взрывает мозг, выложите уже код, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:51:41 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunЯ создала поток, по пулу пытаюсь его найти, из видимых мне, на данный момент способов, это список StackTraces у Thread, он его видит, но ничего считать я не могу. Фак мой мозг. Сделайте HashMap с ключем http session id и значением ваш Thread. Хотя асинхронную задачу стоило инкапсулировать в что-то более приличное: Runnable, Сallable и т.п. Oksana PalunИ кстати, есть ли в ADF возможность управления временем жизни сессий? Google->ADF invalidate session ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:54:17 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunMOHAX7771. По нажатии на кнопку "Пуск" создаётся поток, который сохраняется в application scope с привязкой к пользователю. В этом потоке есть метод, который отдаёт текущий лог. 2. Запускается poll с нужным интервалом, при этом в методе этого poll берётся нужный поток и вызывается метод, который возвращает лог. Этот лог выводим на экран. В случае, если поток завершил работу, то "дизэйблим" poll и "чистим" поток. А можете мне про этот метод рассказать подробнее? Я создала поток, по пулу пытаюсь его найти, из видимых мне, на данный момент способов, это список StackTraces у Thread, он его видит, но ничего считать я не могу. Ну вы же создаёте поток типа: UploadFileThread upt = new UploadFileThread(); Thread threadUploadFile = new Thread(upt); threadUploadFile.start(); вот и положите threadUploadFile в какой-нибудь map (application scope) с привязкой к пользователю. Oksana PalunMOHAX777Проблемы: 1. если приложение валиться, то задачи мрут, если нужно их сохранение, то имеет смысл задействовать БД для хранения задач. 2. Необходимо чистить сохранённые в application scope потоки, если пользователь вышел/отвалился до завершения задачи. Впрочем, его CG может автоматом убрать, но тогда надо думать, где сохранять лог операции. Может, уважаемый Blazkowicz прояснит этот момент. Про отвалы мне уже говорили, пока даже и не думала, об этом. Будем решать проблемы по мере их поступления, задача вроде не должна отрабатывать дольше 10ти минут, а за это время он не валится. И кстати, есть ли в ADF возможность управления временем жизни сессий? стандартно через web.xml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 14:58:54 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
Oksana PalunПоднятие/останов инстансов на линуксовом сервере. инстанс это "экземпляр". "экземпляр" он обычно чего-то (класса, SQL сервера и т.п.)? Это реализовано на pure Java, или запускается внешний процесс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 15:01:36 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
BlazkowiczФак мой мозг. Сделайте HashMap с ключем http session id и значением ваш Thread. Хотя асинхронную задачу стоило инкапсулировать в что-то более приличное: Runnable, Сallable и т.п. Вы конечно понимаете, но для ТС надо бы уточнение чтобы она не забывала регулярно чистить эту мапу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 15:03:56 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
забыл никИзвините но с каждым новым вашим сообщением возникает все большее желание поставить смайлик фейспалм. Ваша терминология просто взрывает мозг Ставьте, если очень хочется, я ADF только учу, поэтому ничего странного, что моя терминология хромает, о чем я Вас предупреждала ранее. Если вы бедете просто рассказывать, как неправильно я выражаюсь, будет менее эффективно, если вы меня поправите. забыл никвыложите уже код, пожалуйста ОК 1. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 2. Создание потока в бине(manage bean) по actionListener Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 3. pool Код: java 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 15:05:59 |
|
||
|
ProgressIndicator в ADF
|
|||
|---|---|---|---|
|
#18+
BlazkowiczOksana PalunПоднятие/останов инстансов на линуксовом сервере. инстанс это "экземпляр". "экземпляр" он обычно чего-то (класса, SQL сервера и т.п.)? Это реализовано на pure Java, или запускается внешний процесс? инстанс схем Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 15:07:28 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2130150]: |
0ms |
get settings: |
18ms |
get forum list: |
20ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
96ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
105ms |
get tp. blocked users: |
3ms |
| others: | 286ms |
| total: | 568ms |

| 0 / 0 |
