Загрузка приложения скопированного бина с ServletContext - PullRequest
2 голосов
/ 17 августа 2011

Я создал класс StartupListener, реализующий ServletContextListener.Внутри

@Override
public void contextInitialized(ServletContextEvent contextEvent) {

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

Вот что я сделал до сих пор:

StartupListener.java

package de.whatever;

import java.util.Timer;
import javax.naming.Context;

public class CargoServiceStartupListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent contextEvent) {

    ....        

        ModuleScannerTask task = new ModuleScannerTask(contextEvent.getServletContext());
        Timer timer = new Timer("Scanner");
        timer.schedule(task, 0, 10000);

ModuleScannerTask.java

package de.whatever;

import java.util.Enumeration;

public class ModuleScannerTask extends TimerTask{

private ServletContext context;

public ModuleScannerTask (ServletContext context) {
    this.context = context;
}

@Override
public void run() {
      System.out.println("Start scanning ...");
          ...

ModuleBean.java

package de.whatever;

@ManagedBean (name="modOverview")
@ApplicationScoped
public class ModuleOverviewBean {

private String randomData;

Мой вопрос заключается в том, как установить данные в поле randomData в компоненте приложения.

Я прочитал, что могу загрузить атрибут "modOverview" из ServletContext, но он возвращает ноль.

Как правильно загрузить и установить значения?

Я использую JBoss (без пружины).

Спасибо Хауке

1 Ответ

4 голосов
/ 17 августа 2011

Если он возвращает null, то это просто означает, что JSF еще не создал его. Просто создайте его самостоятельно. JSF не будет переопределять его, когда он уже присутствует в области приложения. Вам просто нужно знать, что любые управляемые свойства этого класса не будут установлены автоматически.

ModuleOverviewBean bean = (ModuleOverviewBean) servletContext.getAttribute("modOverview");

if (bean == null) {
    bean = new ModuleOverviewBean();
    servletContext.setAttribute("modOverview", bean);
}

// ...

Не связанный с проблемой, java.util.Timer - очень плохой способ выполнения фоновой работы в приложении Java EE. Посмотрите хотя бы на ScheduledExecutorService, или, поскольку вы уже используете JBoss, @Singleton EJB с методом @Schedule.

Смотри также:


Обновление : если настройка управляемых свойств также является вашей задачей, вы также можете попытаться аннотировать управляемый компонент с помощью eager=true следующим образом, чтобы JSF автоматически создавал его при запуске веб-приложения:

@ManagedBean(name="modOverview", eager=true)

Я только не совсем уверен, будет ли это работать до того, как вы запустите ServletContextListener. Я думаю, что так и будет. Однако, это определенно будет работать, если вы используете @Singleton EJB с @Schedule.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...