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



Я понимаю что есть API, но хотелось как-то попонятней.
...
Рейтинг: 0 / 0
12.06.2012, 12:11:34
    #37835120
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
Там в ThreadLocal хранится информация по текущему запросу-ответу. Так сделано, чтобы не протаскивать кучу параметров с уровня сервлетов.
Посмотрите Servlet API. Там сквозной нитью идут ServletRequest и ServletResponse. В фильтре, в методах самого сервлета. И, в случае, MVC ещё и в контроллере. В JSF таких параметров могло бы быть ещё больше. И чтобы их сквозной нитью не тянуть через все классы жизненого цикла (которы в JSF вообще не маленький), есть такой контейнер, где всегда хранятся текущие данные в контексте запроса и ответа.
...
Рейтинг: 0 / 0
12.06.2012, 12:12:09
    #37835123
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
Собственно в 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
12.06.2012, 12:37:10
    #37835146
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
BlazkowiczТам в ThreadLocal хранится информация по текущему запросу-ответу. Так сделано, чтобы не протаскивать кучу параметров с уровня сервлетов.
Посмотрите Servlet API. Там сквозной нитью идут ServletRequest и ServletResponse. В фильтре, в методах самого сервлета. И, в случае, MVC ещё и в контроллере. В JSF таких параметров могло бы быть ещё больше. И чтобы их сквозной нитью не тянуть через все классы жизненого цикла (которы в JSF вообще не маленький), есть такой контейнер, где всегда хранятся текущие данные в контексте запроса и ответа.

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

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

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

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

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

Если задача - самообучение. То сервлетам стоит уделить немного больше внимания, а потом поверхностно изучить всё многообразие web-фреймерков. Начасть с JSF, Spring MVC и GWT. Потом остальные.
Если задача - реализовать проект на JSF, то вникать в сервлеты будете по ходу, если понадобиться.
...
Рейтинг: 0 / 0
12.06.2012, 14:09:19
    #37835239
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
Ищо вопросик про 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
15.01.2013, 20:47:16
    #38111437
Oksana Palun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
BlazkowiczТам в ThreadLocal хранится информация по текущему запросу-ответу.
У меня возникла проблема обращения к FacesContext в потоке. Т.е. я выполняю каку-то задачу на удаленном сервере в отдельном потоке и хочу вывести в сообщении лог выполнения этой задачи, но вот незадача, FacesContext в этих потоках не виден. Как вариант, можно создавать свой FacesContext, но во-первых как-то не очень понятно как это делать, откуда брать запрос/ответ и еще говорят, что в созданном FacesContext сообщения все-равно не выводятся. Как быть?
...
Рейтинг: 0 / 0
15.01.2013, 21:21:30
    #38111466
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
Oksana Palun,

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

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

рассказываю: на клиенте мы решаем с какой схемой(на удаленном сервере) и какую операцию будем выполнять, запускаем скрипт через SSH, во время выполнения скрипта нужно выводить на клиент например попап с картинкой ожидания, по окончанию выполнения скрипта закрываем попап и выводим лог выполнения(оракловский).
Изначально все это планировалось делать по екшнлистенеру кнопки, но так не получилось, поскольку процесс долгоиграющий и он держит кнопку, поэтому и попап и результат выполнения появляется после завершения всего скопом. Выделила выполнения скрипта в отдельный поток, теперь идет запуск попапа и скрипта, который колбасится в отдельном потоке, но вот постала проблема вывода лога.
BlazkowiczНапример введите в гугле JSF long polling - найдёте несколько рецептов как в долгоиграющей задаче обновлять клиента.
гугл уже красный от моих запросов, я перепробовала все, что только можно. Обращалась к другим разработчикам за советом, они порекомендовали запускать скрипти ssh по клиентлистенеру попапа, когда тот уже появился, но так тоже не годится, поскольку мне нужно оперировать переменными бина, а они обнуляется при вызове бина из клиентлистенера.
Буду очень благодарна идеям. С удовольствием начну оперировать вышеназванными понятиями, но пока не совсем понимаю как они мне помогут.
...
Рейтинг: 0 / 0
16.01.2013, 12:21:12
    #38111925
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 12:22:34
    #38111927
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 12:48:50
    #38111988
Oksana Palun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
Blazkowicz[
Тогда осталось сложить лапки и грустить.

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

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

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

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

Oksana Palunа если абы просто покидаться понятиями, то не стоит отвлекаться от своих текущих дел ;)
Ну, это у вас гугл уже красный. И, спасибо, я сам разберусь что мне делать.
...
Рейтинг: 0 / 0
16.01.2013, 14:13:49
    #38112196
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 15:00:44
    #38112309
Oksana Palun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
забыл ник1) У вас есть кнопка на странице Start Job, на акшнлистенере срабатывает метод, который запускает задачу.
2) У вас есть a4j:poll, котрый по дефолту disabled. Так вот, когда старт джоб листенер срабатывает, он выставляет поллеру флаг enabled.
3) Теперь поллер будет с определенным интервалом опрашивать сервер - закончен ли ваш джоб
4) Как узнать что джоб закончен? - Вариантов масса. Это может быть application-scope bean, запись в базе данных, в конце концов файл. Например, можете сделать так - при старте джоба, ему генерится идентификатор, и в базе данных сохраняется запись о джобе со статусом стартед. Когда поток заканчивает выполнение - он обновляет запись на статус комплитед. В поллере вы просто опрашиваете запись на статус.
5) Как только поллер определил что задача закончена, он обновляет UI, и ставит себе статус disabled

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

в том то изначально и была проблема, что по екшнлистенеру нельзя задачу запустить, она не отпускает кнопку, пока не отработает и пулл не запускатся, он запускается тогда, когда все отработает...
...
Рейтинг: 0 / 0
16.01.2013, 15:45:32
    #38112403
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 16:01:49
    #38112432
Oksana Palun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
забыл никВаша начальная страница
<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
16.01.2013, 16:10:55
    #38112449
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 16:16:51
    #38112462
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
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
16.01.2013, 16:23:39
    #38112481
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
забыл никНу вот ко второму дню наконец-то мы пришли к тому что у вас 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
16.01.2013, 17:09:01
    #38112595
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
К слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.
...
Рейтинг: 0 / 0
16.01.2013, 17:16:43
    #38112617
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
BlazkowiczНо polling по-моему отвратное решение. Я бы server push сразу делал.
http://www.slideshare.net/mwessendorf/server-side-push-with-adf-faces


Ну я бы смотрел по задаче, поллинг просто легче имплементировать как по мне, и если он не дает особой нагрузки - и фиг с ним. А так -да, push получше будет)
...
Рейтинг: 0 / 0
16.01.2013, 17:17:37
    #38112620
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FacesContext
BlazkowiczК слову, на JavaScript + Servlet (или любой другой простейший фреймверк) задача решается на много проще в стиле COMET.
Каким-нить jQuery плагином биндится на AJAX запрос к серверу. А сервер без всяких рукописных потоков запускает долгоиграющую задачу и пишет лог в response. JavaScript вычитывает лог частями и обновляет какой-нибудь DIV содержимым.
Реализация простейшая. Никаких своих запускалок потоков и асинхронных задач. JSF - зло.
в точку) трудно не согласиться
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / FacesContext / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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