2015-01-26 6 views
0

У меня есть компонент ApplicationScoped, который я бы хотел получить в реализации кварцевого задания. Этот бит хранит хэш-карту во время выполнения, и я хотел бы заполнить хэш-карту, когда работа запустится. Тем не менее, FacesContext находится вне контекста внутри задания. У меня есть доступ к ServletContext. Можно ли получить доступ к моему bean-компоненту через ServletContext?Access ApplicationScoped bean через ServletContext

Мой код для доступа к Servlet Контекст:

@Override 
public void execute(JobExecutionContext context) throws JobExecutionException { 

    SchedulerContext schedulerContext=null; 
    try { 
     schedulerContext=context.getScheduler().getContext(); 
    } 
    catch (SchedulerException e) { 
     e.printStackTrace(); 
    } 

    ServletContext servletContext=(ServletContext)schedulerContext.get("QuartzServletContext"); 
    BOCacheM bOCacheM = (BOCacheM) servletContext.getAttribute("bOCacheM"); 
} 

Мой QuartzServletContext определяется в web.xml как:

<context-param> 
    <param-name>quartz:scheduler-context-servlet-context-key</param-name> 
    <param-value>QuartzServletContext</param-value> 
</context-param> 

<listener> 
    <listener-class> 
     org.quartz.ee.servlet.QuartzInitializerListener 
    </listener-class> 
</listener> 
+0

Quartz Scheduler и те вещи используют свою собственную нить для запуска. Похож на некоторые проблемы дизайна. Ответ зависит исключительно от функциональных требований, невидимых в вопросе. – Tiny

ответ

0

Да, он хранится в качестве атрибута в ServletContext. Получить его, как и любой другой атрибут:

YourApplicationScopedBean bean = servletContext.getAttribute("yourApplicationScopedBeanName"); 
//use it... 

Если bean это null тогда выглядит ваш компонент не был создан, когда началась кварцевая работа. Убедитесь, что компонент создается путем добавления eager=true к его определению:

@ManagedBean(eager=true) 
@ApplicationScoped 
public class YourApplicationScopedBean { 
    //... 

    @PostConstruct 
    public void init() { 
     //initialize your shared resources here... 
    } 
} 

Обратите внимание, что eager=true применяется только для @ApplicationScoped бобов.

Если это все еще не работает, похоже, что ваше задание кварца запускается еще до того, как компонент был создан и сохранен в контексте приложения. Было бы лучше инициализировать этот ресурс в ServletContextListener, а не в компоненте @ApplicationScoped, и предоставить доступ к этому ресурсу через другой компонент.

+0

Спасибо, но я уже пробовал это, но bean was null. – Rita

+0

@ Чита ответ обновлен. –

+0

Как ни странно, eager = true, похоже, не работает. Боб не создается при выполнении задания. Через отладку я видел атрибуты servletContext, и мой компонент не является частью этого. Возможно, я неправильно понял сервлет. – Rita