powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / FacesContext
36 сообщений из 36, показаны все 2 страниц
FacesContext
    #37835111
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
В JSF есть такой клас как FacesContext, для чево он предназначен?
Пока я его использую что б печетать сообщения на странице:
Код: java
1.
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Сообщение", ""));



Я понимаю что есть API, но хотелось как-то попонятней.
...
Рейтинг: 0 / 0
FacesContext
    #37835120
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там в ThreadLocal хранится информация по текущему запросу-ответу. Так сделано, чтобы не протаскивать кучу параметров с уровня сервлетов.
Посмотрите Servlet API. Там сквозной нитью идут ServletRequest и ServletResponse. В фильтре, в методах самого сервлета. И, в случае, MVC ещё и в контроллере. В JSF таких параметров могло бы быть ещё больше. И чтобы их сквозной нитью не тянуть через все классы жизненого цикла (которы в JSF вообще не маленький), есть такой контейнер, где всегда хранятся текущие данные в контексте запроса и ответа.
...
Рейтинг: 0 / 0
FacesContext
    #37835123
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно в JavaDoc всё тоже самое написано:
FacesContext contains all of the per-request state information related to the processing of a single JavaServer Faces request, and the rendering of the corresponding response. It is passed to, and potentially modified by, each phase of the request processing lifecycle.
...
Рейтинг: 0 / 0
FacesContext
    #37835146
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТам в ThreadLocal хранится информация по текущему запросу-ответу. Так сделано, чтобы не протаскивать кучу параметров с уровня сервлетов.
Посмотрите Servlet API. Там сквозной нитью идут ServletRequest и ServletResponse. В фильтре, в методах самого сервлета. И, в случае, MVC ещё и в контроллере. В JSF таких параметров могло бы быть ещё больше. И чтобы их сквозной нитью не тянуть через все классы жизненого цикла (которы в JSF вообще не маленький), есть такой контейнер, где всегда хранятся текущие данные в контексте запроса и ответа.

Я скажем так начал сразу после основ(Шилд, полный справочник), взялся за JSF.
А сервлеты просто перечитал мельком, создал парочку своих, просто так, посмотреть работают ли они.
Так же само из JSP-страницами, даже простенькие совои теги посоздавал.

Может я слишком поспешыл и мне надо больше узнать про Сервлеты?
Подскажыте на какие основние вопросы/проблемы надо посмотреть при работе з сервлетами?

И вобще, посмотрел я на эти сервлеты и понял, что там все печально, даже и не знаю как долго я б писал на них что-то.
...
Рейтинг: 0 / 0
FacesContext
    #37835154
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Я скажем так начал сразу после основ(Шилд, полный справочник), взялся за JSF.
А сервлеты просто перечитал мельком, создал парочку своих, просто так, посмотреть работают ли они.
Так же само из JSP-страницами, даже простенькие совои теги посоздавал.

Может я слишком поспешыл и мне надо больше узнать про Сервлеты?
Подскажыте на какие основние вопросы/проблемы надо посмотреть при работе з сервлетами?

И вобще, посмотрел я на эти сервлеты и понял, что там все печально, даже и не знаю как долго я б писал на них что-то.

Если задача - самообучение. То сервлетам стоит уделить немного больше внимания, а потом поверхностно изучить всё многообразие web-фреймерков. Начасть с JSF, Spring MVC и GWT. Потом остальные.
Если задача - реализовать проект на JSF, то вникать в сервлеты будете по ходу, если понадобиться.
...
Рейтинг: 0 / 0
FacesContext
    #37835239
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ищо вопросик про FacesContext.
Там есть такая фишка как:

Код: java
1.
2.
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getSessionMap().put("11", user);



Это для работы с сесиями?

Вобщем мне надо узнать кто из залогиненых пользавателей есть на сайте. (Помним, это JSF проект!).

Вот есть клас который проверяет и пускает пользывателей на сайт:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Named("loginBean")
@SessionScoped
public class LoginBean implements Serializable {
    private String login;// Записывается логин
    private String pass;//Записывается пароль
    private String roleId;// Права, нипример администратор или простой пользыватель
    private boolean logined;// Если пользыватель залогинился, то переменная выставляется в true
    
    public void goIn(){
    /*Метод который проверяет, есть ли пользыватель з логином, паролем в базе*/
    }
}



Так вот, как видите этот клас есть @SessionScoped, тобто его обьект существует пока пользыватель не закроет браузер. И в этом обьекте есть поля login, roleId, logined по которым мы знаем инфу пропользывателя.

Для каждого пользывателя который будет заходить на сайт будет создаватся свой обьект LoginBean со своими ogin, roleId, logined.

И таперь самое интересное, как мне узнать кто есть на сайте?

Мне пишут что надо создать что-то вроде такого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class SessionClass implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("------------------------------sessionCreated------------------------------");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("-------------------------------sessionDestroyed--------------------------------");
    }
    
}



Ну в результате мне и пишет в логе:
sessionCreated - когда, я так понял создается сесия
sessionDestroyed - когда удаляется

Но как связать это все с моим класом LoginBean, к котором имеется логин, я не знаю.
...
Рейтинг: 0 / 0
FacesContext
    #38111437
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТам в ThreadLocal хранится информация по текущему запросу-ответу.
У меня возникла проблема обращения к FacesContext в потоке. Т.е. я выполняю каку-то задачу на удаленном сервере в отдельном потоке и хочу вывести в сообщении лог выполнения этой задачи, но вот незадача, FacesContext в этих потоках не виден. Как вариант, можно создавать свой FacesContext, но во-первых как-то не очень понятно как это делать, откуда брать запрос/ответ и еще говорят, что в созданном FacesContext сообщения все-равно не выводятся. Как быть?
...
Рейтинг: 0 / 0
FacesContext
    #38111466
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palun,

Пересмотреть дизайн приложения.
Есть синхронная обработка - request\response, где вы и можете использовать контекст и
есть асинхронная обработка, естественно без всякой привязки к фейсесконтексту.

Не знаю зачем вам все это вообще надо, трудно что-то советовать. Но я предполагаю что вам надо сделать простейший ajax-поллер, который будет опрашивать некий бин, а данные в бине будут появляться как раз из вашего внешнего потока.
...
Рейтинг: 0 / 0
FacesContext
    #38111529
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana PalunУ меня возникла проблема обращения к FacesContext в потоке. Т.е. я выполняю каку-то задачу на удаленном сервере в отдельном потоке и хочу вывести в сообщении лог выполнения этой задачи, но вот незадача, FacesContext в этих потоках не виден. Как вариант, можно создавать свой FacesContext, но во-первых как-то не очень понятно как это делать, откуда брать запрос/ответ и еще говорят, что в созданном FacesContext сообщения все-равно не выводятся. Как быть?
У вас полное недопонимание того как всё устроено. Когда вы создали новый поток у вас нет больше никакой связи с запросом от клиента. Создание собственного FacesContext тем более бесполезное занятие.
Сначала нужно понять задачу с точки зрения браузера и HTTP. А потом уже искать способы реализовать её в JSF.
Long polling, COMET, AJAX, WebSocket это те термины которыми вам нужно оперировать.
Например введите в гугле JSF long polling - найдёте несколько рецептов как в долгоиграющей задаче обновлять клиента.
...
Рейтинг: 0 / 0
FacesContext
    #38111901
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczСначала нужно понять задачу с точки зрения браузера и HTTP. А потом уже искать способы реализовать её в JSF.

рассказываю: на клиенте мы решаем с какой схемой(на удаленном сервере) и какую операцию будем выполнять, запускаем скрипт через SSH, во время выполнения скрипта нужно выводить на клиент например попап с картинкой ожидания, по окончанию выполнения скрипта закрываем попап и выводим лог выполнения(оракловский).
Изначально все это планировалось делать по екшнлистенеру кнопки, но так не получилось, поскольку процесс долгоиграющий и он держит кнопку, поэтому и попап и результат выполнения появляется после завершения всего скопом. Выделила выполнения скрипта в отдельный поток, теперь идет запуск попапа и скрипта, который колбасится в отдельном потоке, но вот постала проблема вывода лога.
BlazkowiczНапример введите в гугле JSF long polling - найдёте несколько рецептов как в долгоиграющей задаче обновлять клиента.
гугл уже красный от моих запросов, я перепробовала все, что только можно. Обращалась к другим разработчикам за советом, они порекомендовали запускать скрипти ssh по клиентлистенеру попапа, когда тот уже появился, но так тоже не годится, поскольку мне нужно оперировать переменными бина, а они обнуляется при вызове бина из клиентлистенера.
Буду очень благодарна идеям. С удовольствием начну оперировать вышеназванными понятиями, но пока не совсем понимаю как они мне помогут.
...
Рейтинг: 0 / 0
FacesContext
    #38111925
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunрассказываю: на клиенте мы решаем с какой схемой(на удаленном сервере) и какую операцию будем выполнять, запускаем скрипт через SSH, во время выполнения скрипта нужно выводить на клиент например попап с картинкой ожидания, по окончанию выполнения скрипта закрываем попап и выводим лог выполнения(оракловский).
Изначально все это планировалось делать по екшнлистенеру кнопки, но так не получилось, поскольку процесс долгоиграющий и он держит кнопку, поэтому и попап и результат выполнения появляется после завершения всего скопом. Выделила выполнения скрипта в отдельный поток, теперь идет запуск попапа и скрипта, который колбасится в отдельном потоке, но вот постала проблема вывода лога.

При чем тут SSH и скрипт какой-то, если тема вроде про JSF была? Это вообещ про web, или у вас JSF в GUI рендерится?
Это всё постановка задачи юзером или менеджером программисту. Как програмисту вам нужно уйти от "кнопок" и понять как это должно работать в HTTP. Изначально в HTTP/DHTML небыло механизма способного позволить серверу послать сообщение на клиента. Поэтому используют различные ухищрения и новые технологии, которые я перечислил выше. Вам стоит с ними ознакомиться. А потом искать применение в вашем проекте.

Oksana Palunгугл уже красный от моих запросов, я перепробовала все, что только можно.

Тогда осталось сложить лапки и грустить.

Oksana PalunОбращалась к другим разработчикам за советом, они порекомендовали запускать скрипти ssh по клиентлистенеру попапа, когда тот уже появился, но так тоже не годится, поскольку мне нужно оперировать переменными бина, а они обнуляется при вызове бина из клиентлистенера.

Можно в терминах JSF? О каком клиентлистенере речь?

Oksana PalunБуду очень благодарна идеям. С удовольствием начну оперировать вышеназванными понятиями, но пока не совсем понимаю как они мне помогут.
В JSF как HTTP/HTML фреймверке нет простого способа послать сообщение от сервера клиенту. Вам нужно изучить какие для этого существуют решения и поискать их реализацию в JSF.
...
Рейтинг: 0 / 0
FacesContext
    #38111927
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunгугл уже красный от моих запросов, я перепробовала все, что только можно.
Тогда вы наверное вот это уже читали
http://technology.amis.nl/2011/10/19/adf-faces-handle-task-in-background-process-and-show-real-time-progress-indicator-for-asynchronous-job-using-server-push-in-adf/
Чам вам не подошло?
...
Рейтинг: 0 / 0
FacesContext
    #38111988
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz[
Тогда осталось сложить лапки и грустить.

очень остроумно, я просила совет, а не подобные комментарии. Есть постановка задачи, если у вас предложения как это можно осуществить, пожалуйста, выскажитесь, а если абы просто покидаться понятиями, то не стоит отвлекаться от своих текущих дел ;)
...
Рейтинг: 0 / 0
FacesContext
    #38112021
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunочень остроумно, я просила совет, а не подобные комментарии.

Советов уже выдал массу. Остались только подобные коментарии.

Oksana PalunЕсть постановка задачи, если у вас предложения как это можно осуществить, пожалуйста, выскажитесь,

Высказался уже. Но вы продолжаете выдавать разные интерпретации постоановки задачи.

Oksana Palunа если абы просто покидаться понятиями, то не стоит отвлекаться от своих текущих дел ;)
Ну, это у вас гугл уже красный. И, спасибо, я сам разберусь что мне делать.
...
Рейтинг: 0 / 0
FacesContext
    #38112196
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palun,

какой-то у вас неправильный гугл. Куда уж понятней обьяснять, чем Blazkowicz, я не представляю, но я попробую:)

1) Вам определенно надо понять, что запуская задачу в отдельном треде, вы теряете всякую связь с JSF и FacesContext в частности.
2) Если вы понимаете как работает HTTP, то определенно должны понимать что сервер не может вам сообщить что задание окончено, следовательно что вы должны сделать? Правильно, опрашивать сервер на наличие изменений, и вот тут плавно подходим к понятию ajax-polling.
Если вы используете richfaces, то ваша задача вообще сводится к элементарному, так как там есть уже готовый компонент a4J:poll, который кстати очень легко гуглится . http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=poll&skin=blueSky

Итак, теперь о самой задаче.

1) У вас есть кнопка на странице Start Job, на акшнлистенере срабатывает метод, который запускает задачу.
2) У вас есть a4j:poll, котрый по дефолту disabled. Так вот, когда старт джоб листенер срабатывает, он выставляет поллеру флаг enabled.
3) Теперь поллер будет с определенным интервалом опрашивать сервер - закончен ли ваш джоб
4) Как узнать что джоб закончен? - Вариантов масса. Это может быть application-scope bean, запись в базе данных, в конце концов файл. Например, можете сделать так - при старте джоба, ему генерится идентификатор, и в базе данных сохраняется запись о джобе со статусом стартед. Когда поток заканчивает выполнение - он обновляет запись на статус комплитед. В поллере вы просто опрашиваете запись на статус.
5) Как только поллер определил что задача закончена, он обновляет UI, и ставит себе статус disabled

Если у вас нет желания использовать richfaces или подобные фреймворки, написать аналог руками не так уж и сложно.
...
Рейтинг: 0 / 0
FacesContext
    #38112309
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник1) У вас есть кнопка на странице Start Job, на акшнлистенере срабатывает метод, который запускает задачу.
2) У вас есть a4j:poll, котрый по дефолту disabled. Так вот, когда старт джоб листенер срабатывает, он выставляет поллеру флаг enabled.
3) Теперь поллер будет с определенным интервалом опрашивать сервер - закончен ли ваш джоб
4) Как узнать что джоб закончен? - Вариантов масса. Это может быть application-scope bean, запись в базе данных, в конце концов файл. Например, можете сделать так - при старте джоба, ему генерится идентификатор, и в базе данных сохраняется запись о джобе со статусом стартед. Когда поток заканчивает выполнение - он обновляет запись на статус комплитед. В поллере вы просто опрашиваете запись на статус.
5) Как только поллер определил что задача закончена, он обновляет UI, и ставит себе статус disabled

Если у вас нет желания использовать richfaces или подобные фреймворки, написать аналог руками не так уж и сложно.
так я тоже делала, только запускала задачу не по екшнлистенеру кнопки, а по клиентлистенеру пула, поскольку по екшнлистенеру запускается ожидалка....Но, в данном способе у меня возникла проблема вызова экземпляра класса бина без очищения данных. Т.е. когда клиентлистенер вызывает метод, запускающий задачу, очищаются все переменные бина, установленные на клиенте, поэтому я решила выделить этот процесс в отдельный поток...
Может объясняю криво, ну как могу, я еще не очень хорошо владею терминологией, поправляйте, если что.
...
Рейтинг: 0 / 0
FacesContext
    #38112325
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник1) У вас есть кнопка на странице Start Job, на акшнлистенере срабатывает метод, который запускает задачу.

в том то изначально и была проблема, что по екшнлистенеру нельзя задачу запустить, она не отпускает кнопку, пока не отработает и пулл не запускатся, он запускается тогда, когда все отработает...
...
Рейтинг: 0 / 0
FacesContext
    #38112403
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunтак я тоже делала, только запускала задачу не по екшнлистенеру кнопки, а по клиентлистенеру пула, поскольку по екшнлистенеру запускается ожидалка....Но, в данном способе у меня возникла проблема вызова экземпляра класса бина без очищения данных. Т.е. когда клиентлистенер вызывает метод, запускающий задачу, очищаются все переменные бина, установленные на клиенте, поэтому я решила выделить этот процесс в отдельный поток...
Может объясняю криво, ну как могу, я еще не очень хорошо владею терминологией, поправляйте, если что.

Так. тут определенно проблемы с терминологией. Лично мне непонятны две вещи, что за клиентлистенер и что за пулл. Возможно вы под пулом подразумеваете все же компонент поллера? Давайте я еще раз разложу вам вариант с richfaces по шагам и с кодом.

Ваша начальная страница
<h:commandButton actionListener="#{bean.startJob}" value="Старт"></h:commandButton>
<a4j:poll enabled="#{bean.enabled}" actionListener="#{bean.checkJobResults}" interval="6000" reRender="result"/>
<h:panelGroup id="result">
<rich:messages/>//ну это если через контекст, можно просто брать из бина #{bean.data}, короче со способом определитесь
</h:panelGroup>
Ваши бины
Bean 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.
@SessionScoped
public class Bean{

private boolean enabled;
//getter setter for enabled

public void startJob(){
     Job job = new Job();
     //тут мы запускаем job в отдельном потоке, вариантов масса - 1) через Thread t =new Thread(job).start(); 2) ложим в ExecutorPool  3) Ложим в JMS. Например используем 1)
     Thread t =new Thread(job).start();
     //все ваш джоб исполняется в другом потоке, actionListener успешно заканчивает выполнение, и никаких зависаний на кнопке Старт.
     //включаем поллер
     enabled = true;
}

public void checkResults(){
      ifJobCompleted(){
           //получаем то что надо отобразить
           //и кладем в facesContext
           Result result = getResult();
           FacesContext.putMessage(result);
           //выключаем поллер
           enabled = false;
      }
}

}



По сути вам нужно написать методы isJobCompleted и getResult() со своей логикой. Для этого вам нужно
1) Подумать как определить что джоб закончен 2) Продумать как получить инфу и как ее отобразить.

Я бы делал так - в стартДжоб создавал в БД запись Джоб со стасусом Стартед, а в сессионный бин клал его идентификатор. В потоке джоба, когда он заканчивается, я бы апдейтил джоб и ставил ему статус комплитед, и сохранял результат в колонке result.
В методе изДжобКоплитед проверял статус джоба, если комплитед, клал бы в result - job.GetResult(); Как-то так. На самом деле вариантов масса, начиная с applicationScope bean заканчивая JMS и файлами.
...
Рейтинг: 0 / 0
FacesContext
    #38112432
Oksana Palun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никВаша начальная страница
<h:commandButton actionListener="#{bean.startJob}" value="Старт"></h:commandButton>
<a4j:poll enabled="#{bean.enabled}" actionListener="#{bean.checkJobResults}" interval="6000" reRender="result"/>
<h:panelGroup id="result">
<rich:messages/>//ну это если через контекст, можно просто брать из бина #{bean.data}, короче со способом определитесь
</h:panelGroup>

мы по ходу, чутка о разных вещах говорим, судя по коду, это ajax, я пишу на JDev(ADF). То, чтоу вас a4j:poll здесь af:poll, так?

забыл никpublic void startJob(){
Job job = new Job();
//тут мы запускаем job в отдельном потоке, вариантов масса - 1) через Thread t =new Thread(job).start(); 2) ложим в ExecutorPool 3) Ложим в JMS. Например используем 1)
Thread t =new Thread(job).start();
//все ваш джоб исполняется в другом потоке, actionListener успешно заканчивает выполнение, и никаких зависаний на кнопке Старт.
//включаем поллер
enabled = true;
}

да, только тут возникает проблема получения лога выполнения процесса, если его не писать в БД(что есть bad practice, как по мне), то вернуть результат из потока ...есть разве способ?
забыл никЯ бы делал так - в стартДжоб создавал в БД запись Джоб со стасусом Стартед, а в сессионный бин клал его идентификатор. В потоке джоба, когда он заканчивается, я бы апдейтил джоб и ставил ему статус комплитед, и сохранял результат в колонке result.

это вариант, но хотелось бы обойтись без захламления БД схем подобной информацией, как-то это ж можно решить с помощью средств ADFа?!
...
Рейтинг: 0 / 0
FacesContext
    #38112449
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunмы по ходу, чутка о разных вещах говорим, судя по коду, это ajax, я пишу на JDev(ADF). То, чтоу вас a4j:poll здесь af:poll, так?

Да, вроде очень похожи.

Oksana Palunда, только тут возникает проблема получения лога выполнения процесса, если его не писать в БД(что есть bad practice, как по мне),

Какая проблема? Куда вы пишете лог?

Oksana Palunто вернуть результат из потока ...есть разве способ?

Ну, например. java.util.concurrent.Future.get() - возвращает результат асинхронной задачи. Можно в пямяти лог держать. А по PollEvent сбрасывать его.


Oksana Palunзабыл никЯ бы делал так - в стартДжоб создавал в БД запись Джоб со стасусом Стартед, а в сессионный бин клал его идентификатор. В потоке джоба, когда он заканчивается, я бы апдейтил джоб и ставил ему статус комплитед, и сохранял результат в колонке result.

это вариант, но хотелось бы обойтись без захламления БД схем подобной информацией, как-то это ж можно решить с помощью средств ADFа?!
Этот вариант это переизобретение JMS. Вам стоит подумать что произойдёт с вашими асинхронными задачами в случае перезагрузки сервера.
...
Рейтинг: 0 / 0
FacesContext
    #38112462
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oksana Palunзабыл никВаша начальная страница
<h:commandButton actionListener="#{bean.startJob}" value="Старт"></h:commandButton>
<a4j:poll enabled="#{bean.enabled}" actionListener="#{bean.checkJobResults}" interval="6000" reRender="result"/>
<h:panelGroup id="result">
<rich:messages/>//ну это если через контекст, можно просто брать из бина #{bean.data}, короче со способом определитесь
</h:panelGroup>

мы по ходу, чутка о разных вещах говорим, судя по коду, это ajax, я пишу на JDev(ADF). То, чтоу вас a4j:poll здесь af:poll, так?

забыл никpublic void startJob(){
Job job = new Job();
//тут мы запускаем job в отдельном потоке, вариантов масса - 1) через Thread t =new Thread(job).start(); 2) ложим в ExecutorPool 3) Ложим в JMS. Например используем 1)
Thread t =new Thread(job).start();
//все ваш джоб исполняется в другом потоке, actionListener успешно заканчивает выполнение, и никаких зависаний на кнопке Старт.
//включаем поллер
enabled = true;
}

да, только тут возникает проблема получения лога выполнения процесса, если его не писать в БД(что есть bad practice, как по мне), то вернуть результат из потока ...есть разве способ?
забыл никЯ бы делал так - в стартДжоб создавал в БД запись Джоб со стасусом Стартед, а в сессионный бин клал его идентификатор. В потоке джоба, когда он заканчивается, я бы апдейтил джоб и ставил ему статус комплитед, и сохранял результат в колонке result.

это вариант, но хотелось бы обойтись без захламления БД схем подобной информацией, как-то это ж можно решить с помощью средств ADFа?!

Ну вот ко второму дню наконец-то мы пришли к тому что у вас ADF, совсем незначительная деталь:) Если честно с ADF совсем незнаком, конкретных инструкций не дам. Могу только концептуально.
Ну, во-первых захламлять БД - это понятие растяжимое, зависит от задачи. Если у вас нет полноценной сущности джоб, и функционала допустим чтобы просмотреть кто когда и что запускал и с какими результатом, то да - вы наверное правы.

Насчет того как потокам обменяться информацией - есть масса способов - разделяемая память, БД, файлы.
...
Рейтинг: 0 / 0
FacesContext
    #38112481
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНу вот ко второму дню наконец-то мы пришли к тому что у вас ADF, совсем незначительная деталь :)
http://www.sql.ru/forum/actualthread.aspx?tid=996954
;)

Но polling по-моему отвратное решение. Я бы server push сразу делал.
http://www.slideshare.net/mwessendorf/server-side-push-with-adf-faces
http://matthiaswessendorf.wordpress.com/2009/12/05/adf-faces-and-server-side-push/
К тому же нужно какой-то лог постоянно перекачивать на клиента.
...
Рейтинг: 0 / 0
FacesContext
    #38112595
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.
...
Рейтинг: 0 / 0
FacesContext
    #38112617
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНо polling по-моему отвратное решение. Я бы server push сразу делал.
http://www.slideshare.net/mwessendorf/server-side-push-with-adf-faces


Ну я бы смотрел по задаче, поллинг просто легче имплементировать как по мне, и если он не дает особой нагрузки - и фиг с ним. А так -да, push получше будет)
...
Рейтинг: 0 / 0
FacesContext
    #38112620
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczК слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.
в точку) трудно не согласиться
...
Рейтинг: 0 / 0
FacesContext
    #38112651
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никBlazkowiczК слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.
в точку) трудно не согласиться
Всему свое место.
На каком-нибудь хомячке и прокатит, особенно если безопасность не интересует.
JSF это не только рендерер html, не забываем, что это еще и реализация jsr спецификаций
...
Рейтинг: 0 / 0
FacesContext
    #38112658
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraВсему свое место.
На каком-нибудь хомячке и прокатит, особенно если безопасность не интересует.
JSF это не только рендерер html, не забываем, что это еще и реализация jsr спецификаций
Очередной реверанс в сторону спецификаций? Servlet это jsr спецификация. Задача полностью решаема на сервлетах. Это достаточно безопасно?
...
Рейтинг: 0 / 0
FacesContext
    #38112688
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraзабыл никпропущено...

в точку) трудно не согласиться
Всему свое место.
На каком-нибудь хомячке и прокатит, особенно если безопасность не интересует.
JSF это не только рендерер html, не забываем, что это еще и реализация jsr спецификаций

при чем тут спецификации? если уж говорить о них, то вспомните к примеру EJB2, наверное все кто не следовал ей глупцы? Хотя вопрос конечно не об этом. JSF is overabstracted bull-shit. Я не вижу ни одной задачи, в которой бы он давал хоть какие-то весомые преимущества по сравнению с другими фреймворками, и как показывает этот пример, в некоторых задачах простые сервлеты рвут говноjsf в пух и прах.
...
Рейтинг: 0 / 0
FacesContext
    #38112728
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никivanraпропущено...

Всему свое место.
На каком-нибудь хомячке и прокатит, особенно если безопасность не интересует.
JSF это не только рендерер html, не забываем, что это еще и реализация jsr спецификаций

при чем тут спецификации? если уж говорить о них, то вспомните к примеру EJB2, наверное все кто не следовал ей глупцы? Хотя вопрос конечно не об этом. JSF is overabstracted bull-shit. Я не вижу ни одной задачи, в которой бы он давал хоть какие-то весомые преимущества по сравнению с другими фреймворками, и как показывает этот пример, в некоторых задачах простые сервлеты рвут говноjsf в пух и прах.
Странный спор. Я пишу "всему свое место", вы - "сервлеты в некоторых задачах". О чем спорим? :)
Ну подумайте, доверитесь ли вы "простому" сервлету решение какой-нибудь административной или финансовой задачи? Например, просто так, вне контекста приложения, поменять пароль пользователя или выполнить транзакцию по счету? Не FacesContext, так какой - нибудь другой контекст придется иметь под рукой.
Я уже не говорю о портлетах, где клиент даже не знает, на каком сервере запущено приложение.
...
Рейтинг: 0 / 0
FacesContext
    #38112741
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraдоверитесь ли вы "простому" сервлету решение какой-нибудь административной или финансовой задачи? Например, просто так, вне контекста приложения, поменять пароль пользователя или выполнить транзакцию по счету? Не FacesContext, так какой - нибудь другой контекст придется иметь под рукой.
Я уже не говорю о портлетах, где клиент даже не знает, на каком сервере запущено приложение.
Жесть. Т.е. к JSF тупо больше субъективного доверия и этим он "объективно" безопаснее. Нельзя так просто на сервлете сделать финансовую транзакцию. Вы что. Это ведь так не безопасно. Надо взять сертифицированые JEE фреймверки, комерческий JEE сервер. И только тогда транзакция станет безопасной. Ведь мы купили суппорт JEE сервера и там всегда есть желающие, кто поможет зайти в базу и откатить, упаси бог, не валидную финансовую транзакцию.
...
Рейтинг: 0 / 0
FacesContext
    #38112788
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О_О Солидный вброс:)
Я честно минут 10 думал, какая связь между jsf и финансовыми транзакциями и как именно JSF меня обезопасит:) Не говоря о том, что JSF сам работает на тех же сервлетах)
Есичо я просто хотел сказать что JSF отстой, и я не вижу ни единого разумного применения для него, и я это сделал:)
...
Рейтинг: 0 / 0
FacesContext
    #38113325
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никЕсичо я просто хотел сказать что JSF отстой, и я не вижу ни единого разумного применения для него, и я это сделал:)
'отстой' - это сильно сказано, а за остальное двумя руками!!!
...
Рейтинг: 0 / 0
FacesContext
    #38113702
MOHAX777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczК слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.

если не затруднит, приведите, пожалуйста ссылку на пример такой реализации. Ну и в догонку: это работает на всех браузерах, такая вещь по тайм-ауту не отваливается?
...
Рейтинг: 0 / 0
FacesContext
    #38113725
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MOHAX777если не затруднит, приведите, пожалуйста ссылку на пример такой реализации.
google->COMET example
Например
http://cometdaily.com/2009/10/23/concrete-comet-examples/


MOHAX777 Ну и в догонку: это работает на всех браузерах, такая вещь по тайм-ауту не отваливается?
Вот про таймауты. Они возможны. Они будут. Нужно иметь возможность их разруливать.
http://stackoverflow.com/questions/1192375/timeout-behavior-of-different-browsers
На счет работать во всех браузерах, это уже смотря как сделать. Если например WebSocket заюзать, то наверное многие старые не умеют ещё. В самую древность, когда ещё термин AJAX не был распространен, делали на iframe. Работало.
...
Рейтинг: 0 / 0
FacesContext
    #38113760
MOHAX777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczMOHAX777если не затруднит, приведите, пожалуйста ссылку на пример такой реализации.
google->COMET example
Например
http://cometdaily.com/2009/10/23/concrete-comet-examples/

ок, спасибо.

BlazkowiczMOHAX777 Ну и в догонку: это работает на всех браузерах, такая вещь по тайм-ауту не отваливается?
Вот про таймауты. Они возможны. Они будут. Нужно иметь возможность их разруливать.
http://stackoverflow.com/questions/1192375/timeout-behavior-of-different-browsers
На счет работать во всех браузерах, это уже смотря как сделать. Если например WebSocket заюзать, то наверное многие старые не умеют ещё. В самую древность, когда ещё термин AJAX не был распространен, делали на iframe. Работало.
понятно. С poll можно реализовать такой сценарий: запускаем операцию с выводом лога в окно и можем гулять по другим страницам, а когда возвращаемся - видим лог выполняющейся операции. С comet такое не прокатит, как я понимаю?
...
Рейтинг: 0 / 0
FacesContext
    #38113786
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MOHAX777понятно. С poll можно реализовать такой сценарий: запускаем операцию с выводом лога в окно и можем гулять по другим страницам, а когда возвращаемся - видим лог выполняющейся операции. С comet такое не прокатит, как я понимаю?
Да, правильно. Но тогда нужно хранить этот лог на сервере. Что как минимум усложняет разработку. А как максимум создаёт ещё и лишнюю нагрузку на сервер.
Но здесь уже от бизнес требований зависит какой способ выбрать. Oksana спрашивала о возможности сервера уведомить клиента. Если при этом "ходить по другим страницам", то ни о каких уведомлениях речи быть не может.
Можно, конечно, попробовать скомбинировать, и, если клиент, отвалился, хранить дальнейший лог на сервере и отдавать по возвращении клиента.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / FacesContext
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]